CSharp - 如何在多个字段中使用 LINQ Distinct()

  显示原文与译文双语对照的内容
0 0

我有以下 EF类源自数据库( 简体)

class Product
{ 
     public string ProductId;
     public string ProductName;
     public string CategoryId;
     public string CategoryName;
}

ProductId主键的表。

不好的设计决策所做的数据库设计器( I 才能对其进行修改),我 CategoryIdCategoryName此表中。

我要 DropDownList 使用( distinct ) CategoryId作为CategoryName作为 Text 。 因此我应用以下代码:

product.Select(m => new {m.CategoryId, m.CategoryName}).Distinct();

这逻辑上它应该创建匿名对象, CategoryIdCategoryName为属性。 。 Distinct()保证没有重复值对( CategoryId, CategoryName) 。

但实际上它不起作用。 就我理解的 Distinct()时的作用就只有一个字段集合中,否则它只是忽略他们除掉它正确? 有什么解决方法? 谢谢 !

UPDATE

抱歉 product是:

List<Product> product = new List<Product>();

我找到了另外一种方法来获取结果相同 Distinct():

product.GroupBy(d => new {d.CategoryId, d.CategoryName}) 
       .Select(m => new {m.Key.CategoryId, m.Key.CategoryName})
时间:原作者:10个回答

0 0

我假设你使用不同的喜欢列表上的方法调用。 例如,你需要将查询的结果作为数据源为DropDownList具体化时,它通过 ToList.

var distinctCategories = product
                        .Select(m => new {m.CategoryId, m.CategoryName})
                        .Distinct()
                        .ToList();
DropDownList1.DataSource     = distinctCategories;
DropDownList1.DataTextField  = "CategoryName";
DropDownList1.DataValueField = "CategoryId";
原作者:
0 0

Distinct( ) 保证没有重复值对( CategoryId,categoryname ) 。

提出了完全一致的号召

匿名类型'神奇'实现 EqualsGetHashcode

我猜另一个错误的地方。 casE sEnSitiVity? 可变类? 非可比的字段?

原作者:
0 0

Distinct 方法返回序列中的非重复元素。

如果你看一下它的实现上与Reflector,那么将会看到该过程将创建 DistinctIterator为匿名类型。 不同的迭代器将元素添加到 Set在对集合进行枚举。 此枚举器将跳过所有的内容已经在 Set. Set使用 GetHashCodeEquals方法来定义元素是否已经存在于 Set.

如何 GetHashCodeEquals实现对匿名类型呢? 因为它在msdn 指出:

equals和GetHashCode方法上定义了匿名类型而言Equals和GetHashcode方法属性,仅当同一匿名类型的两个实例的所有家产相等。

这样,你本来就该有不同的匿名对象,在不同的集合上进行迭代。 和结果不依赖于有多少字段用于自己的匿名类型。

原作者:
0 0

使用 Key下面的关键字中选择也能用,比如。

product.Select(m => new {Key m.CategoryId, Key m.CategoryName}).Distinct();

我知道这是造就一个旧线程但看它可能会帮到一些人 通常我在VB代码.NET在使用.NET所以 Key可能翻译不同C#中。

原作者:
0 0
Employee emp1 = new Employee() { ID = 1, Name = "Narendra1", Salary = 11111, Experience = 3, Age = 30 };Employee emp2 = new Employee() { ID = 2, Name = "Narendra2", Salary = 21111, Experience = 10, Age = 38 };
Employee emp3 = new Employee() { ID = 3, Name = "Narendra3", Salary = 31111, Experience = 4, Age = 33 };
Employee emp4 = new Employee() { ID = 3, Name = "Narendra4", Salary = 41111, Experience = 7, Age = 33 };
List<Employee> lstEmployee = new List<Employee>();
lstEmployee.Add(emp1);
lstEmployee.Add(emp2);
lstEmployee.Add(emp3);
lstEmployee.Add(emp4);
var eemmppss=lstEmployee.Select(cc=>new {cc.ID,cc.Age}).Distinct();
原作者:
...