繁体   English   中英

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

[英]How do I know if elements from one list appear in another?

我需要知道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>();

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

提前致谢

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

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

以下方法中的代码基本上说: “如果任何获胜组合中的所有项目都包含在玩家的组合中,则返回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!
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM