簡體   English   中英

在C#中使列表與眾不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM