计算一个列表中元素在另一个列表中的出现次数

Counting occurrences of elements from one list in another list

我有两个列表。虽然不是通常的。

第一个:

Combinations<string> someCombination = new Combinations<string>(someOtherList, 2);
var firstList = someCombination.ToList();  

它returns:

 [0] { cy gr }
 [1] { cy ja }
 [2] { cy ka }
 [3] { cy wo }
 [4] { cy zo }
 [5] { gr ja }
 [6] { gr ka }
 [7] { gr wo }
 [8] { gr zo }
 [9] { ja ka }
[10] { ja wo }
[11] { ja zo }
[12] { ka wo }
[13] { ka zo }
[14] { wo zo }

第二个:

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

它returns:

 [0] { gr ch wo zo }
 [1] { zo cy gr ma }
 [2] { wo po ja cy }
 [3] { ja ka po gr }
 [4] { zo ka ja og }
 [5] { cy ja zo wo }
 [6] { gr og po ma }
 [7] { wo zo ka cy }
 [8] { gr og wo ja }
 [9] { ja ka ch wo }

如您所见,我正在使用 Combinatorics.Collections 库。 我真正想要的是计算 firstListstring 元素在整个 secondList 中出现的次数,并将所有这些计数存储在第三个列表中。喜欢这个:

List<int> occurrences = new List<int>();

这是一个示例,这个列表看起来像什么,每个索引都匹配 firstList 索引:

 [0] 1  //because both "cy" and "gr" are contained in 1 secondList sublist(s)
 [1] 2  //because both "cy" and "ja" are contained in 2 secondList sublist(s)
 [2] 1  //et cetera..
 [3] 3
 [4] 1
 [5] 2
 [6] 1
 [7] 2
 [8] 2
 [9] 3
[10] 4
[11] 2
[12] 2
[13] 2
[14] 3

^如果我数错了,那是我的错。

我认为 LINQ 在这里可能会派上用场,但我对它完全没有希望。如果我错了,请纠正我。非常感谢您的帮助。

  var occurrences = firstList.Select(l => secondList.Count(ss => l.All(ss.Contains))).ToList();

请注意,如果这些列表很大并且您关心性能,这不是一个好的解决方案。那样的话我会考虑选择更合适的数据结构。