C# 如何知道一个列表中的元素是否出现在另一个列表中?

C# 如何知道一个列表中的元素是否出现在另一个列表中?,c#,C#,我需要知道一种在C#中确定listX中的元素是否出现在listY中的有效方法。我可以通过编写大量循环以一种(可能)低效的方式来完成,但我想一定有一种更快的方式(lambda表达式?) 我正在从Java跳到C语言,所以很多东西对我来说都是新的。我正在写一个Tic-Tac-Toe游戏,有7个场景可以赢一场游戏 private int[] scenarioA = {1, 2, 3}; private int[] scenarioB = {4, 5, 6}; private

我需要知道一种在C#中确定listX中的元素是否出现在listY中的有效方法。我可以通过编写大量循环以一种(可能)低效的方式来完成,但我想一定有一种更快的方式(lambda表达式?)

我正在从Java跳到C语言,所以很多东西对我来说都是新的。我正在写一个Tic-Tac-Toe游戏,有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>();
List clickedCellsO=newlist();
List clickedCellsX=新建列表();
有谁能给我一个建议,如何不使用循环工作台来完成这项工作

提前感谢

您可以使用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));

您可以使用
列表
存储获胜组合,然后选中使用一些
System.Linq
方法来确定玩家的组合是否包含获胜组合的项目

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


你听说过林克吗?谢谢@RufusL。很高兴知道。我现在用的是列表。我想。你需要的是交集。请注意-您缺少1,5,9(对角线-从左上到右下)作为有效的赢家。如果您关心的是CPU性能,我建议使用3x3位电路板和逐位操作不是最好的选择,但我不会用[1,5,3,9]赢?@Xiaoy312用缺少的组合以及更好的逻辑更新了示例以确定赢家。正如您所指出的,计数不需要匹配,只要玩家的组合包含其中一个获胜组合的所有项目即可。
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!
}