计算List 出现在List >

问题描述 投票:0回答:3

[有一个类似的问题无法回答我的问题。 -> Count number of element in List>

我有一个包含子列表的列表:

List<string> sublist1 = new List<string>() { "a", "b" };
List<string> sublist2 = new List<string>() { "a", "b" };
List<string> sublist3 = new List<string>() { "a", "c" };

现在我想计算每个列表的出现次数。

a, b --> 2
a, c --> 1

我使用了LINQ的distinct(),但得到了输出:

a, b --> 1
a, b --> 1
a, c --> 1

我假设哈希码不同。除了distinct()以外,还有其他替代项正在查看列表值吗?我想在LINQ中解决此问题。

编辑:列表项的顺序必须相同!

c# list linq count compare
3个回答
0
投票
要使用GroupBy()执行此操作,您将需要一个合适的IEqualityComparer<List<string>>,用于比较字符串列表。没有内置的实现,因此您必须自己滚动:

public sealed class StringListEqualityComparer : IEqualityComparer<List<string>> { public bool Equals(List<string> x, List<string> y) { if (ReferenceEquals(x, y)) return true; if (x == null || y == null) return false; return x.SequenceEqual(y); } public int GetHashCode(List<string> strings) { int hash = 17; foreach (var s in strings) { unchecked { hash = hash * 23 + s?.GetHashCode() ?? 0; } } return hash; } }

一旦掌握了这一点,就可以将其与GroupBy()一起使用,如下所示:

public static void Main() { var sublist1 = new List<string>{ "a", "b" }; var sublist2 = new List<string>{ "a", "b" }; var sublist3 = new List<string>{ "a", "c" }; var listOfLists = new List<List<string>> {sublist1, sublist2, sublist3}; var groups = listOfLists.GroupBy(item => item, new StringListEqualityComparer()); foreach (var group in groups) { Console.WriteLine($"Group: {string.Join(", ", group.Key)}, Count: {group.Count()}"); } }


0
投票
我想我会用:

var equallists = list1.SequenceEqual(list2);

因此,我比较不同的列表和具有SequenceEquals()的列表,并对它们进行计数。 

更好的解决方案,欢迎您。 :)


0
投票
public JsonResult CountList(){ List<List<string>> d = new List<List<string>>(); //SuperList d.Add(new List<string> { "a", "b" }); //List 1 d.Add(new List<string> { "a", "b" }); // List 2 d.Add(new List<string> { "a", "c" }); // List 3 d.Add(new List<string> { "a", "c", "z" }); //List 4 var listCount = from items in d group items by items.Aggregate((a,b)=>a+""+b) into groups select new { groups.Key, Count = groups.Count() }; return new JsonResult(listCount); }

0
投票
List<List<string>> d = new List<List<string>>(); //SuperList d.Add(new List<string> { "a", "b" }); //List 1 d.Add(new List<string> { "a", "b" }); // List 2 d.Add(new List<string> { "a", "c" }); // List 3 d.Add(new List<string> { "a", "c", "z" }); //List 4 var listCount = from items in d group items by items.Aggregate((a,b)=>a+""+b) into groups select new { groups.Key, Count = groups.Count() };
© www.soinside.com 2019 - 2024. All rights reserved.