在LINQ中使用distinct,其中涉及> 1列

时间:2014-02-28 14:14:56

标签: c# asp.net-mvc linq

我有一个记录列表,其中3个属性是

VendorId
VendorName
VendorDesc

同一供应商可能有多个实例。

我想要做的是使用VenderDesc属性检索“VendorNames”的“不同”列表。

返回一个属性很好,即

var myVendorNameList = myRecords.Select(r=>r.VendorName).Distinct();

但是我希望将VendorDesc添加到此列表中,之后我将使用foreach输出(Razor View)内容,即

foreach (var item in myVendors)
{
 Name: @item.VendorName 
 Desc: @item.VendorDesc 
}

提前致谢。

3 个答案:

答案 0 :(得分:5)

最简单的方法是GroupBy您想要的字段,并决定您想要的重复记录

myRecords.GroupBy(r=>r.VendorName)
         .Select(g => g.First());

答案 1 :(得分:2)

您可以使用GroupBy。这也会返回VendorId属性,但我认为这不是问题。

myRecords.GroupBy(x => x.VendorName).Select(g => g.First());

答案 2 :(得分:2)

我认为,使用morelinq's DistinctBy(如提到的LB)或创建自己的那个将更具可读性

public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source, 
                                                 Func<T, TKey> keySelector)
{
    HashSet<TKey> keys = new HashSet<TKey>();
    return source.Where(x => keys.Add(keySelector(x)));
}

您现在可以将其用作

myVendorNameList  = myRecords.DistinctBy(r=>r.VendorName);