我有一个空字典:
Dictionary<List<string>, int> occurrences = new Dictionary<List<string>, int>();
这是我的锯齿状列表:
List<List<string>> jaggedList = new List<List<string>>();
x是我要在锯齿状列表中计算的第一个元素的数量。在这个例子中:
x=2;
但我希望每当我得到一个更厚的&#34;子列表比x + 1
参差不齐的清单:
{ cc kk ww }
{ cc kk aa }
{ cc oo ll }
{ cc jj oo }
{ ww oo kk }
{ ww oo gg }
{ ww gg kk }
{ kk ll oo }
{ ll kk nn }
{ mm nn oo }
{ mm nn jj }
我对LINQ完全没有希望,所以我不能自己做。我希望我的occurrences
字典能够在x
中获取分组TKey
索引元素,并且其出现次数计入TValue
,因此结果如下所示:
Keys: Values:
{ cc kk } 2 //because those appear together in this order in 2 sublist(s)
{ cc oo } 1 //because those appear together in this order in 1 sublist(s)
{ cc jj } 1 //et cetera
{ ww oo } 2
{ ww gg } 1
{ kk ll } 1 //<-note that those do not appear in this order twice
{ ll kk } 1
{ mm nn } 2
作为提示,我也有一个linq命令,它会做同样的事情,除了字符串列表但是有常规字符串:
我正在谈论的字符串:
List<string> list = new List<string>();
{ gg }
{ gg }
{ jj }
{ ww }
{ ww }
{ jj }
{ mm }
{ ww }
{ ll }
{ kk }
{ ll }
Linq命令:
var dic = list.GroupBy(b => b).ToDictionary(group => group.Key, group => group.Count());
字典:
Dictionary<string, int> otherOccurrences = dic;
结果:
Keys: Values:
{ gg } 2 //because it appears in this list 2 time(s)
{ jj } 2 //same with this one
{ ww } 3 //et cetera
{ mm } 1
{ ll } 2
{ kk } 1
我真的很感激编辑指定的linq
命令的帮助,以获得与我的occurrences
类似的命令。如果我错了,请随时纠正我。对不起,如果我没有说清楚,也可以随意问你是否理解,所以我可以更具体地解释一下。
答案 0 :(得分:1)
要解决的主要问题是平等。两个相同的&#34;列表不相等。即使它们包含相同的元素,它们仍然是不同的对象。您必须向IEqualityComparer
函数提供GroupBy
:
var n = 2;
var dic = list.Select(l => l.Take(n))
.GroupBy(b => b, new IEnumerableComparer<string>())
.ToDictionary(group => group.Key, group => group.Count());
IEnumerableComparer
按内容对列表进行比较。可以有很多方法来实现它。这里有一个不错的例子:IEqualityComparer for SequenceEqual。