Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将列表中的每个元素与其他元素进行比较_C#_Linq_List_Combinations - Fatal编程技术网

C# 将列表中的每个元素与其他元素进行比较

C# 将列表中的每个元素与其他元素进行比较,c#,linq,list,combinations,C#,Linq,List,Combinations,编写遍历列表中每个2元素组合的控件结构的最佳方法是什么 例如: {0,1,2} 我想让一段代码运行三次,每次运行一次: {0,1} {1,2} {0,2} 我尝试了以下方法 foreach (int i in input) { foreach (int j in input.Where(o => o != i)) { //Execute code } } 但是,当一个列表有两个相同的元素时,这将不起作用。与 {0,2,0} 我仍然希望比较元素

编写遍历列表中每个2元素组合的控件结构的最佳方法是什么

例如:

{0,1,2}
我想让一段代码运行三次,每次运行一次:

{0,1}
{1,2}
{0,2}
我尝试了以下方法

foreach (int i in input)
{
    foreach (int j in input.Where(o => o != i))
    {
        //Execute code
    }
}
但是,当一个列表有两个相同的元素时,这将不起作用。与

{0,2,0}

我仍然希望比较元素
0
0
。该值与此无关。

听起来您可能需要以下内容:

for (int i = 0; i < list.Count - 1; i++)
{
    for (int j = i + 1; j < list.Count; j++)
    {
        // Use list[i] and list[j]
    }
}
我不确定这是否更清楚

编辑:另一种效率较低但可能更清晰的替代方案:

var pairs = from i in Enumerable.Range(0, list.Count - 1)
            let x = list[i]
            from y in list.Skip(i + 1)
            select Tuple.Create(x, y);
如果您使用的是C#7或更高版本,则可以利用该类型。它提供

输出:

对:0,1
配对:0,2
配对:1,2

完美,比我想象的简单多了。如果可能的话,我会接受的。谢谢你,但是你是对的,LINQ解决方案的可读性要差得多,而且很可能要慢得多。谢谢,第一个版本(for loop)很有魅力!然而,我认为第二个版本(LINQ)有问题,因为它引发了一个IndexOutfrange异常(两个版本之间的索引处理略有不同,但我没有时间找出如何修复它)。@Ishikawa:我认为这是一个逐个错误,我现在已经修好了。你每一对都在做什么?你的解和Jon的解都是O(n平方)。取决于你在做什么,可能有一个O(n)解决方案。(例如,在C#编译器中,您需要比较重载解析问题中的每一对方法,以确定唯一的最佳方法;即使更好的方法关系是不及物的,也有一个O(n)算法。)
var pairs = from i in Enumerable.Range(0, list.Count - 1)
            let x = list[i]
            from y in list.Skip(i + 1)
            select Tuple.Create(x, y);
public static IEnumerable<(T, T)> GetAllPairs<T>(IList<T> source)
{
    return source.SelectMany((_, i) => source.Where((_, j) => i < j),
        (x, y) => (x, y));
}
foreach ((int x, int y) in GetAllPairs(new[] { 0, 1, 2 }))
{
    // Execute code
    Console.WriteLine($"Pair: {x}, {y}");
}