[英]Making a list distinct in C#
在C#中,我有一個對象類型'A',其中包含鍵值對列表。
鍵值對是類別字符串和值字符串。
要實例化對象類型A,我將必須執行以下操作:
List<KeyValuePair> keyValuePairs = new List<KeyValuePair>();
keyValuePairs.Add(new KeyValuePair<"Country", "U.S.A">());
keyValuePairs.Add(new KeyValuePair<"Name", "Mo">());
keyValuePairs.Add(new KeyValuePair<"Age", "33">());
A a = new A(keyValuePairs);
最終,我將得到一個A對象類型的列表,並且我想操縱該列表,以便僅獲得唯一值,並且僅基於國家/地區名稱。 因此,我希望列表減少為僅包含一個“國家”,“美國”,即使它出現了不止一次。
我一直在研究linq Distinct,但是它並沒有實現我想要的功能,因為它無法定義任何參數,並且因為它似乎無法捕獲兩個等效的A型對象。我知道可以覆蓋“等於”方法,但是它仍然不能解決我的問題,即基於一個鍵值對使列表與眾不同。
為了擴展卡爾·安德森(Karl Anderson)關於使用morelinq的建議,如果您無法(或不想)為您的項目鏈接到另一個dll,我不久前就實現了這一點:
public static IEnumerable<T> DistinctBy<T, U>(this IEnumerable<T> source, Func<T, U>selector)
{
var contained = new Dictionary<U, bool>();
foreach (var elem in source)
{
U selected = selector(elem);
bool has;
if (!contained.TryGetValue(selected, out has))
{
contained[selected] = true;
yield return elem;
}
}
}
用法如下:
collection.DistinctBy(elem => elem.Property);
在支持它的.NET版本中,可以使用HashSet<T>
代替Dictionary<T, Bool>
,因為我們實際上並不關心該值有多少,因為它已經被哈希了。
您需要首先選擇與眾不同的屬性:
因為它是列表中的列表,所以可以使用SelectMany。 SelectMany將合並子選擇的結果。
List<A> listOfA = new List<A>();
listOfA.SelectMany(a => a.KeyValuePairs
.Where(keyValue => keyValue.Key == "Country")
.Select(keyValue => keyValue.Value))
.Distinct();
應該是這樣。 它將選擇鍵為“國家/地區”的所有值,並合並列表。 最終它將與國家不同。 假定類A的屬性KeyValuePairs至少為IEnumerable <KeyValuePair <字符串,字符串>>
在morelinq項目中檢查DistinctBy
語法。
A a = new A(keyValuePairs);
a = a.DistinctBy(k => new { k.Key, k.Value }).ToList();
var result = keyValuePairs.GroupBy(x => x.Key)
.SelectMany(g => g.Key == "Country" ? g.Distinct() : g);
您可以使用groupby語句。 在這里,您可以進行各種出色的工作
listOfA.GroupBy(i=>i.Value)
您可以將值分組,然后將所有鍵或其他有用的東西相加
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.