【问题标题】:C# - Iterate over all possible pairwise combinations of array contentsC# - 遍历数组内容的所有可能的成对组合
【发布时间】:2013-09-18 02:46:20
【问题描述】:

如果我有一个 C# 对象数组并且想要遍历所有成对组合,如何最好地完成?对于:

int[] list = new int[3] {100, 200, 300};

这看起来像:

100, 200
100, 300
200, 300

显然,我想要一个可以接受任意大小数组的函数,并且最好是通用的,以便任何对象类型都可以工作。

【问题讨论】:

  • 为什么不直接使用嵌套循环?

标签: c# arrays combinations


【解决方案1】:

试试这个:

public static IList<Tuple<T,T>> GetPairs<T>(IList<T> list)    
{
    IList<Tuple<T,T>> res = new List<Tuple<T,T>>();
    for (int i = 0; i < list.Count(); i++)
    {
        for (int j = i + 1; j < list.Count(); j++)
        {
            res.Add(new Tuple<T, T>(list[i], list[j]));
        }
    }
    return res;
}

【讨论】:

    【解决方案2】:
    int[] input = new int[] {100, 200, 300};
    
    List<int[]> result = new List<int[]>();
    
    for(int i=0; i<input.Length-1; i++)
    {
        for(int j=i+1; j<input.Length; j++)
        {
            result.Add(new int[]{input[i], input[j]});
        }
    }
    

    【讨论】:

    • 第一个循环应该有 loop condition 作为 i&lt;input.Length-1
    • 我不明白为什么?我刚刚运行它并得到了他想要的确切结果。
    • 是的,但是最后一个循环i=input.Length-1 是多余的,在那个循环j=input.Length 并没有执行更多,我不是说你的代码不起作用,只是有点多余。
    【解决方案3】:
    int[] arr = { 800, 11, 50, 771, 649, 770, 240, 9 };      
    
            for (int i = 0; i < arr.Length; i++)
            {
                for (int j= i; j< arr.Length; j++)
                {
        if(i!=j)
    
    
                        //Console.Write(arr[i] + " " + arr[j]);
    Console.WriteLine(arr[i] + " " + arr[j]);
    
                }
            }
    

    您可以使用 Object 类型,而不是 'int'。然后你需要保持进一步的检查。

    【讨论】:

    • 这可能会输出800 1111 800,这不是OP想要的。
    • 这提供了所有排列,而不是所有组合。
    • @Doug 我的代码提供了与您的示例问题数据一样的精确解决方案。
    • (您需要使用 WriteLine 而不是 Write。)
    • 应该投反对票,因为您使用 'if (i != j)' 而不是仅将 j 初始化为 i + 1。这是完全没有必要的检查。
    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多