使用LINQ从现有列表(T)创建新的不同列表(T)

时间:2011-06-01 16:16:21

标签: vb.net linq list distinct

如何使用LINQ从现有列表中获取新的不同列表?这是我到目前为止所做的事情并没有区别,但确实给了我一个新的清单。

Dim tmpQryColumn = (From a In _allAudits 
                    Select New CheckBoxListItem 
                    With {.Id = a.AuditColumn, .Name = a.AuditColumn} 
                    ).Distinct()
_columnList = New List(Of CheckBoxListItem)(tmpQryColumn)

2 个答案:

答案 0 :(得分:1)

我怀疑问题是CheckboxListItem没有覆盖Equals / GetHashCode所以任何两个实例都是有效的。尝试:

Dim columns = (From a In _allAudits
               Select a.AuditColumn).Distinct()

_columnList = (From column in columns
               Select New CheckBoxListItem 
               With {.Id = column, .Name = column} 
               ).ToList()

我确信在VB中编写它有一种更简单的方法,但我对编写它的语法不够熟悉。 C#版本将是:

_columnList = _allAudits.Select(x => x.AuditColumn)
                        .Distinct()
                        .Select(x => new CheckboxListItem { Id = x, Name = x })
                        .ToList();

答案 1 :(得分:0)

Distinct扩展方法依赖于正确实现值相等的问题类型。它失败的最可能原因是CheckBoxListItem没有基于IdName属性实现相等性。

要解决此问题,请执行以下操作之一

  1. 实现CheckBoxListItem
  2. 的等同语义
  3. 创建IEqualityComparer<CheckBoxListItem>并使用Distinct的重载来获取该值