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();
看看是否有帮助