我有List<IEnumerable<int>>
。我想计算列表中每个IEnumerable<int>
的出现次数。例如:
using System.Linq;
List<IEnumerable<int>> list = new List<IEnumerable<int>>();
list.Add(new int[] { 5 }.AsEnumerable() );
list.Add(new int[] { 7, 8 }.AsEnumerable());
list.Add(new int[] { 5 }.AsEnumerable());
list.Add(new int[] { 5 }.AsEnumerable());
list.Add(new int[] { 9 }.AsEnumerable());
list.Add(new int[] { 4 }.AsEnumerable());
此list
的{{1}} 3
值IEnumerable<int>s
,5
出现其他元素。
我试过了:
1
不幸的是,这两者都会导致var one = list.ToArray().GroupBy(i => i).ToDictionary(x => x.Key.ToArray(), x => x.Count());
var two = list.GroupBy(x => x).Select(x => x).ToDictionary(x => x.Key, x => x.Count());
foreach(var item in one) { //or two
Console.WriteLine("key {0} .. item {1}",
string.Join(", ", item.Key.ToArray()),
item.Value);
}
出现次数(即使1
的值IEnumerable<int>s
出现5
次。
有任何建议吗?
的修改
正如MarcinJuraszek所指出的那样:“你必须定义一个自定义比较器,因为IEnumerable的默认比较器将执行引用相等。” 我得到所有1的原因是因为它正在搜索内存中的地址,这些都是不同的。为了解决这个问题而不编写自定义比较器,我做到了这一点:
3