假设您有一个包含多个条目的 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 }(排序无关)。这是为什么?
尝试结对:
这是我的代码。如果看起来脑子有问题我想道歉,我最近睡眠不足。
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 (排序不相关)。 谢谢您的帮助。
让我们创建一个
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