class obj
{
int typeID; //10 types 0-9
string uniqueString; //this is unique
}
假设列表中有100个obj元素,但只有10个唯一的typeID。
是否有可能写一个LINQ查询从objs列表返回10个唯一的整数?linq查询返回对象列表中不同的字段值
class obj
{
int typeID; //10 types 0-9
string uniqueString; //this is unique
}
假设列表中有100个obj元素,但只有10个唯一的typeID。
是否有可能写一个LINQ查询从objs列表返回10个唯一的整数?linq查询返回对象列表中不同的字段值
objList.Select(o=>o.typeId).Distinct()
当然,请使用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());
'。首先'是好的,因为如果没有东西在里面,你就没有这个组。 – mquander 2011-06-03 18:54:32
你可以使用'GroupBy'的替代重载来简化它 - 请参阅我的答案。 – 2011-06-03 18:55:50
假设你想要完整的对象,但只想通过typeID
来处理独特性,没有什么内置的int LINQ使这个变得简单。 (如果您只是希望typeID
值,很容易 - 工程与Select
,然后使用普通Distinct
通话。)
在MoreLINQ我们有DistinctBy
操作,您可以使用:
var distinct = list.DistinctBy(x => x.typeID);
这只适用于LINQ to Objects。
你可以用一组或查找,它只是有点讨厌,效率低下:
var distinct = list.GroupBy(x => x.typeID, (key, group) => group.First());
要让DistinctBy出现,您需要添加命名空间Microsoft.Ajax.Utilities – Shiljo 2016-08-11 01:33:29
@Shil:不,我正在写关于MoreLINQ中的DistinctBy。与Microsoft.Ajax.Utilities无关。 – 2016-08-11 01:38:59
我想结合特定的数据到下拉,它应该是不同的。 我做了以下内容:
List<ClassDetails> classDetails;
List<string> classDetailsData = classDetails.Select(dt => dt.Data).Distinct.ToList();
ddlData.DataSource = classDetailsData;
ddlData.Databind();
看看是否有帮助
如果只是想用户纯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 });
第二种形式似乎使用distinct超载据我所知,这并不存在。 – 2011-06-03 18:56:26
哎呀,删除第二个,谢谢@Jon Skeet,可以用IEqualityComparer – 2011-06-03 19:01:00
完成正如Jon Skeet所说,这将只返回Select中指定的属性。 – 2016-03-09 10:53:21