来自不同列表的元素的摘要,这些元素都彼此相关

问题描述 投票:0回答:1

假设您有一个包含多个条目的 List 实例。例如:

List<List<int>> inputLists = new List<List<int>>
{
    new List<int> { 4, 2, 1 },
    new List<int> { 5, 9, 1 },
    new List<int> { 6, 1, 2 },
    new List<int> { 9, 4, 3 },
    new List<int> { 9, 4, 2 }
};

我现在想总结更大列表中的元素(如果每个元素都与每个元素相关)。结果列表至少应包含 4 个元素。对于上面的示例,我们的结果将是一个仅包含一个条目的 List:{ 4, 2, 1, 9 }(排序无关)。这是为什么?

尝试结对:

  • 9 与 1 在同一个列表中(检查第二个列表)
  • 9 与 2 在同一个列表中(最后检查)
  • 9 与 4 在同一个列表中(检查第四个/最后一个)
  • 4、2 和 1 也都在同一个列表中(首先检查;微不足道)

这是我的代码。如果看起来脑子有问题我想道歉,我最近睡眠不足。

internal void Test()
{
    List<List<int>> inputLists = new List<List<int>>
{
    new List<int> { 4, 2, 1 },
    new List<int> { 5, 9, 1 },
    new List<int> { 6, 1, 2 },
    new List<int> { 9, 4, 3 },
    new List<int> { 9, 4, 2 }
};

    foreach (var input in inputLists)
    {
        IEnumerable<IEnumerable<int>> results = Array.Empty<IEnumerable<int>>();
        input.ForEach(number =>
        {
            //first step: getting all numbers that are related to "number"
            //number is 4 | related ones are: 4, 2, 1, 9, 3
            IEnumerable<int> everyFrickingNumberAppearing = Array.Empty<int>();
            inputLists.Where(inputList => inputList.Contains(number)).ToList()
            .ForEach(inputList =>
            everyFrickingNumberAppearing =   everyFrickingNumberAppearing.Concat(inputList).Distinct()
            );


            var IReallyDontKnowWhatIAmDoing = everyFrickingNumberAppearing
            //trying out every number
            .Where(probablyRelatedNumber => inputLists
            //looking if there is at least one element that
            //appears in at least one list together with "number"
            .Any(list => list.Contains(probablyRelatedNumber) && list.Contains(number)))
            .ToArray();
            //appending all related numbers of "number" to results
            results.Append(IReallyDontKnowWhatIAmDoing);
        });
        //going through results
        results.ToList().ForEach(r =>
        {
            //selecting only nums which appear in every result
            var importantNums = r.Select(num => results.ToList().All(l => l.Contains(num)));
            //print it
            importantNums.ToList().ForEach(n => Console.Write($"{n} "));
            Console.WriteLine();
        });
    }
}

如上所述,我预计输出为 4 2 1 9 (排序不相关)。 谢谢您的帮助。

c# .net list linq numbers
1个回答
0
投票

让我们创建一个

HashSet<(int, int)>
来存储同一列表中出现的每对数字。为了简单起见,让我们将配对存储两次为 (x, y) 和 (y, x)。这简化了进一步的处理。

var pairs = new HashSet<(int, int)>();
foreach (var smallList in _inputLists) {
    foreach (int a in smallList) {
        foreach (int b in smallList) {
            if (a != b) {
                pairs.Add((a, b));
            }
        }
    }
}

由于每对出现两次(x,y)和(y,x),我们现在可以简单地按其中一项进行分组(

Item1
)并计算它出现的次数以过滤至少出现 4 次的项目.

var result = pairs
    .Select(p => p.Item1)
    .GroupBy(x => x)
    .Where(g => g.Count() >= 4);
foreach (var g in result) {
    Console.WriteLine(g.Key);
}

打印:

4
2
1
9
© www.soinside.com 2019 - 2024. All rights reserved.