从C#列表中获取对象对的最佳方法

3

我有一个名为Team的对象列表,想要最优的方法获取所有可能的对象对。这是一个示例:

public void GenerateMatches(Team team)
    {

        for(int i = 0; i < team.Count-1; i++)
        {
            for (int j = i + 1; j < team.Count; j++)
            {
                Console.WriteLine("Match:" + team[i].Name + " vs " + team[j].Name);
            }
        }
    }

这不是最优解,但它能够运行。有更好的想法吗?

"Team1 对阵 Team2" 和 "Team2 对阵 Team1" 是一样的,我认为这是您想表达的意思。 - Khalil Khalaf
6
为什么这个“远非最佳选择”?你尝试了什么? - CodeCaster
7
你必须列举出N * (N - 1) / 2个可能的配对组合,这是不可避免的;你的解决方案在这个意义上是最优的。 - Dmitry Bychenko
你发送一个 team,然后将其迭代为 teams - Khalil Khalaf
@FirstStep 对于那个复制粘贴错误,抱歉。 - Dimitris Karagiannis
要明确的是,我想要相同的输出,但我想知道是否有更好的方法! - Dimitris Karagiannis
2个回答

2

以下是解决方案:

您需要迭代Teams并将currentTeam与所有下一个索引配对:

    List<int> MyList = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9}; // sample input

    List<KeyValuePair<int, int>> MyPairs = new List<KeyValuePair<int, int>>(); // prepare final result

    for (int i = 0; i < MyList.Count; i++)
        for (int j = i + 1; j < MyList.Count; j++)
            if(j < MyList.Count)
                MyPairs.Add(new KeyValuePair<int, int> (MyList[i], MyList[j]));

然后展示如下:
    foreach (var pair in MyPairs)
        Console.WriteLine(pair.Key +" vs "+ pair.Value);

输出的一部分:

在此输入图片描述


你缺少一些括号 ")"。 - Jamie Rees
@CharlesMager 又是一位运维大佬 :) 我打字速度有点快.. 谢谢你指出来 :) 现在应该可以了。 - Khalil Khalaf
1
哈哈!该死的@FirstStep! - Jamie Rees
哈哈,我刚刚才注意到。干得好..嗯,我用了一个if语句而不是.Count - 1 :P @CharlesMager 那么这就是最优的方式了..我猜! - Khalil Khalaf
@DimitrisKaragiannis 很高兴我们能够帮到你。我认为在这种情况下没有更好、更快的方法,也没有显著的差异。也许可以使用 ++i 而不是 i++,但在这些情况下差别并不大。如果这对你有帮助,请点赞/接受答案。 - Khalil Khalaf
显示剩余4条评论

1

最优的运行时间是n(n - 1)/2,因为这是有序对的数量。
你的解决方案是最优的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接