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