使用LINQ按列表分组<string>值</string>

时间:2013-03-08 22:23:29

标签: c# .net linq

我有以下SortedDictionary:

SortedDictionary<string, List<string>> dict 
            = (SortedDictionary<string,List<string>>) MyObj.GetDict();

dict中有许多列表具有相同的值,我想使用LINQ将具有相似列表的所有这些行折叠成一行。但是,每个列表都是一个对象,因此LINQ将它们视为不同的实体。

我的问题是:如何设置我的代码,以便GroupBy(grp =&gt; grp.Value)实际按字典内容对字典进行分组,而不是列表对象本身?

1 个答案:

答案 0 :(得分:3)

创建一个自定义IEqualityComparer<IList<string>>,您可以将其用于大多数linq方法,例如GroupByDistinct。请注意,它也适用于实现string[]的{​​{1}}:

IList<string>

然后,您可以使用以下查询来创建一个dictinct public class IgnoreOrderComparer : IEqualityComparer<IList<string>> { public IgnoreOrderComparer(StringComparer comparer) { this.Comparer = comparer; } public StringComparer Comparer { get; set; } public bool Equals(IList<string> x, IList<string> y) { if (x == null || y == null) return false; // remove the Distincts if there are never duplicates as mentioned return !x.Distinct(Comparer).Except(y.Distinct(Comparer), Comparer).Any(); // btw, this should work if the order matters: // return x.SequenceEqual(y, Comparer); } public int GetHashCode(IList<string> arr) { if (arr == null) return int.MinValue; int hash = 19; foreach (string s in arr.Distinct(Comparer)) { hash = hash + s.GetHashCode(); } return hash; } }

示例数据:

SortedDictionary<string, List<string>>

首先在列表上使用SortedDictionary<string, List<string>> dict = new SortedDictionary<string, List<string>>(); dict.Add("A", new List<string>() { "A", "B" }); dict.Add("B", new List<string>() { "B", "B" }); dict.Add("C", new List<string>() { "A", "B" }); dict.Add("D", new List<string>() { "C", "E" }); dict.Add("E", new List<string>() { "E", "C" }); ,然后将它们与原始字典连接起来,最后创建一个新字典:

Distinct

即使列表中字符串的顺序很重要,它也可能会有所帮助。