Как я узнаю, появляются ли элементы из одного списка в другом?

#c#

#c#

Вопрос:

Мне нужно знать эффективный способ в C # определить, отображаются ли элементы в ListX в listY. Я могу сделать это (возможно) неэффективным способом, написав много циклов, но я думаю, что есть более быстрый способ (лямбда-выражения?)

Я перехожу с 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>();
 

Кто-нибудь может дать мне совет, как это сделать, не используя скамейку петель?

Заранее спасибо

Комментарии:

1. Вы когда-нибудь слышали о LINQ?

2. Спасибо @RufusL. Приятно это знать. В данный момент я использую List<int> .

3. Я думаю. Intersect — это то, что вам нужно. c-sharpcorner.com/UploadFile/87b416 /…

4. Просто обратите внимание — вам не хватает 1,5,9 (по диагонали — сверху слева направо снизу справа) в качестве действительного победителя.

5. Если вас беспокоит производительность процессора, я бы рекомендовал использовать битовую плату 3×3 и битовые операции

Ответ №1:

Вы можете просто использовать 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));
 

Ответ №2:

Вы могли бы использовать a 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!
}
 

Комментарии:

1. Не лучший ход, но я не выигрываю с [1,5,3,9] ?

2. @Xiaoy312 обновил образец с недостающей комбинацией, а также улучшил логику для определения победителя. Как вы заметили, количество не обязательно должно совпадать, просто комбинация игрока содержит все элементы одной из выигрышных комбинаций.