linq查询从对象列表返回不同的字段值

class obj { int typeID; //10 types 0-9 string uniqueString; //this is unique } 

假设有100个obj元素的列表,但只有10个唯一的typeID。
有没有可能写一个LINQ查询从objs列表返回10个唯一的整数?

 objList.Select(o=>o.typeId).Distinct() 

假设你想要完整的对象,但只想通过typeID来处理不同的typeID ,那么LINQ中就没有内置任何东西来实现这一点。 (如果你只是想要typeID值,很容易 – 使用Select投影,然后使用正常的Distinct调用。)

在MoreLINQ中,我们有DistinctBy运算符,您可以使用它:

 var distinct = list.DistinctBy(x => x.typeID); 

这只适用于LINQ到对象。

你可以使用分组或查找,这只是有点烦人和低效:

 var distinct = list.GroupBy(x => x.typeID, (key, group) => group.First()); 

如果只想要用户纯Linq,则可以使用groupby:

 List<obj> distinct = objs.GroupBy(car => car.typeID).Select(g => g.First()).ToList(); 

如果你想在整个应用程序中使用一个方法:

 public static IEnumerable<TSource> DistinctBy<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { HashSet<TKey> seenKeys = new HashSet<TKey>(); foreach (TSource element in source) { if (!seenKeys.Contains(keySelector(element))) { seenKeys.Add(keySelector(element)); yield return element; } } } 

正如MoreLinq所做的那样

使用这个方法来使用Id属性来查找不同的值,你可以使用:

 var query = objs.DistinctBy(p => p.TypeId); 

你可以使用多个属性:

 var query = objs.DistinctBy(p => new { p.TypeId, p.Name }); 

当然,使用Enumerable.Distinct

给定一个obj (例如foo )的集合,你可以这样做:

 var distinctTypeIDs = foo.Select(x => x.typeID).Distinct(); 

我认为这是你的要求:

  var objs= (from c in List_Objects orderby c.TypeID select c).GroupBy(g=>g.TypeID).Select(x=>x.FirstOrDefault()); 

类似于用LINQ返回一个不同的IQueryable?

我想绑定一个特定的数据下拉,它应该是不同的。 我做了以下几点:

 List<ClassDetails> classDetails; List<string> classDetailsData = classDetails.Select(dt => dt.Data).Distinct.ToList(); ddlData.DataSource = classDetailsData; ddlData.Databind(); 

看看是否有帮助