计算子列表的前 x 个元素在锯齿列表的所有子列表中的出现次数

本文关键字:列表 元素 计算 | 更新日期: 2023-09-27 18:32:18

我有一个空字典:

Dictionary<List<string>, int> occurrences = new Dictionary<List<string>, int>();

这是我的锯齿状列表:

List<List<string>> jaggedList = new List<List<string>>();

x 是我即将在锯齿状列表中计算的第一个元素的数量。在此示例中:

x=2;

但是我希望每当我得到比 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 }

林克命令:

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执行相同操作的命令。如果我在某处错了,请随时纠正我。如果我没有说清楚,我很抱歉,如果您不明白,也可以随时询问,以便我可以更具体地解释。

计算子列表的前 x 个元素在锯齿列表的所有子列表中的出现次数

要解决的主要问题是平等。两个"相同"的列表并不相等。即使它们包含相同的元素,它们仍然是不同的对象。您必须为 GroupBy 函数提供IEqualityComparer

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按列表的内容比较列表。有很多方法可以实现它。一个不错的例子是:SequenceEqual的IEqualityComparer。