c# - 计算订单相关列表的出现次数在列表中>
- >
问题描述
有一个类似的问题没有回答我的问题。-->计算列表中的元素个数>
我有一个包含子列表的列表:
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
我distinct()
从 LINQ 使用,但我得到了输出:
a, b --> 1
a, b --> 1
a, c --> 1
我假设哈希码是不同的。是否有替代方法distinct()
是查看列表值?如果可能的话,我想在 LINQ 中解决这个问题。
编辑:列表项的顺序必须相同!
解决方案
为此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()}");
}
}
推荐阅读
- mongodb - 我如何知道一个 mgo 会话是否已关闭
- .net - .net core 2.1 支持 Nhibernate?
- haskell - agreggateId 的流的 GroupBy (Haskell / 并发流)
- c++ - 使用 egl (opengl) 和 freetype2 在屏幕上呈现文本时不出现文本
- django - django模型表单自动编辑
- php - PHP 创建按钮带有 mySql DB
- python - 如何使用交替排序打印堆叠在“金字塔”中的序列?
- android - 使在 Android 中的 ARCore 上播放的视频变暗
- rest - MS VSTS Rest API:获取给定项目的附件列表
- android - android中的webview主机应用程序