[英]group a list and only get distinct values when input is a list
我需要以下方面的幫助:
我有一個列表,需要從中刪除所有重復條目,但我似乎無法獲得正確的 linq 查詢。 現在列表本身包含一個字符串和一個字符串列表作為參數。
查看代碼片段:
該列表是從此類創建的
public class SD
{
public string From { get; set; }
public List<string> To { get; set; }
}
列表的輸入可能如下所示:
var unsortedList = new List<SD>
{
new SD {From = "a", To = new List<string>{ "b" } },
new SD {From = "b", To = new List<string>{ "a" } },
new SD {From = "a", To = new List<string>{ "b", "c" } },
new SD {From = "a", To = new List<string>{ "b" } },
new SD {From = "a", To = new List<string>{ "c" } },
};
在類中的 To 是一個列表並且只是一個字符串之前,下面的代碼運行良好。 它將返回 4 個條目,因為條目 1 和 4 相等(當然,第 3 個條目只有一個字符串)。
var sortedList = unsortedList.GroupBy(x => new { x.From, x.To }).Select(group => group.First()).ToList();
我一直在玩 orderby、group 和 hashsets,但似乎都不起作用。
您可以將To
列表加入字符串並將其用作GroupBy
方法中的鍵選擇器的一部分。 然后選擇每組中的第一項以獲取沒有重復項的SD
項列表
var sortedList = unsortedList.GroupBy(x => new {x.From, To = string.Join(",", x.To)})
.Select(g => g.First())
.ToList();
foreach (var item in sortedList)
Console.WriteLine($"{item.From} {string.Join(",", item.To)}");
它將產生以下輸出
a b
b a
a b,c
a c
您可以在此處創建自定義IEqualityComparer<T>
:
public class MyComparer : IEqualityComparer<SD>
{
public bool Equals(SD x, SD y)
{
return x.From == y.From && x.To.SequenceEqual(y.To);
}
public int GetHashCode(SD obj)
{
return obj.From.GetHashCode();
}
}
然后將此比較器應用於Distinct()
以刪除重復項:
var noDuplicates = unsortedList.Distinct(new MyComparer());
foreach (var item in noDuplicates)
{
Console.WriteLine($"From={item.From} To={string.Join(", ", item.To)}");
}
// From=a To=b
// From=b To=a
// From=a To=b, c
// From=a To=c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.