我怎么知道一个列表中的元素是否出现在另一个列表中?

时间:2019-04-16 17:32:35

标签: c#

我需要了解C#中的一种有效方法,以确定listX中的元素是否出现在listY中。我可以通过编写许多循环以(也许)低效率的方式来做到这一点,但我想有一种必须更快的方式(lambda表达式?)

我正在从Java过渡到C#,所以很多事情对我来说都是新的。我正在写井字游戏,并有7个场景可以赢得比赛。

    private int[] scenarioA = {1, 2, 3}; 
    private int[] scenarioB = {4, 5, 6}; 
    private int[] scenarioC = {7, 8, 9}; 
    private int[] scenarioD = {3, 5, 7}; 
    private int[] scenarioE = {1, 4, 7}; 
    private int[] scenarioF = {2, 5, 8}; 
    private int[] scenarioG = {3, 6, 9};

无论何时玩家按下按钮,我都会将单元格的编号保存在clickedCellsO或ClickedCellsX中。击中5个单元格后,我需要检查是否有获胜者,因此我需要遍历clickedCellsO或ClickedCellsX以查看其是否具有方案之一的组合。

List<int> clickedCellsO = new List<int>();
List<int> clickedCellsX = new List<int>();

任何人都可以给我一个建议,而无需使用长凳循环吗?

预先感谢

2 个答案:

答案 0 :(得分:2)

您可以只使用LINQ:

var winningConditions = new[] {
    scenarioA,
    scenarioB,
    scenarioC,
    // ...
};

var hasPlayerOWon = winningConditions.Any(placements => placements.All(clickedCellsO.Contains));
var hasPlayerXWon = winningConditions.Any(placements => placements.All(clickedCellsX.Contains));

答案 1 :(得分:1)

您可以使用List<List<int>>存储获胜组合,然后检查使用某些System.Linq方法来确定玩家的组合是否包含All()个项目中的Any()个的获胜组合。

以下方法中的代码基本上说:“如果任何获胜组合中的所有项目都包含在玩家的组合中,则返回true,否则返回false”。

private static readonly List<List<int>> WinningCombinations = new List<List<int>>
{
    new List<int> {1, 2, 3}, new List<int> {1, 5, 9},
    new List<int> {1, 4, 7}, new List<int> {2, 5, 8},
    new List<int> {3, 5, 7}, new List<int> {3, 6, 9},
    new List<int> {4, 5, 6}, new List<int> {7, 8, 9},
};

private static bool IsAWinner(List<int> playerCombination)
{
    return WinningCombinations.Any(winningCombo => 
        winningCombo.All(playerCombination.Contains));
}

在使用中,您可能会做类似的事情:

if (IsAWinner(clickedCellsX))
{
    // Player 'X' wins!
}