2015-02-09 3 views
0

Я хотел бы использовать linq, чтобы проверить, возвращает ли один из нескольких логических операторов true.Использование Linq для проверки правильности логического выражения

До сих пор я попытался следующие:

winningCombinations = new[,] 
    { 
     {1,2,3}, 
     {4,5,6}, 
     {7,8,9}, 
     {1,4,7}, 
     {1,4,7}, 
     {3,6,9}, 
     {1,5,9}, 
     {3,5,7} 
    }; 
if (Enumerable.Range(0,7).Where(x => this.contentOf(winningCombinations[x,0]) == this.contentOf(winningCombinations[x,1]) && 
            this.contentOf(winningCombinations[x,1]) == this.contentOf(winningCombinations[x,2])) 
            .Select(x => true).FirstOrDefault(x => x)) 
    { 
     _isDone = true; 
     _game.wonBy(_turnOf); 
    } 

В основном contentOf() требуется индекс в качестве параметра и возвращает символьное значение. Мой вопрос в том, есть ли способ заставить мой код работать? Я хотел бы использовать координаты, содержащиеся в «victoryCombinations», чтобы проверить, есть ли выигрышная комбинация на моей сетке (3 одинаковых символа), предпочтительно используя Linq.

+0

Вы должны описать то, что проблема с текущим подходом и, возможно, разместить код в contentOf(), а также. –

ответ

0

Я довольно не понимаю, на что вы пытаетесь, но это звучит как IEnumerable.Any должно делать то, что вы хотите.

if (Enumerable.Range(0,7) 
       .Any(x => this.contentOf(winningCombinations[x,0]) == this.contentOf(winningCombinations[x,1]) && 
         this.contentOf(winningCombinations[x,1]) == this.contentOf(winningCombinations[x,2])) 
{ 
    _isDone = true; 
    _game.wonBy(_turnOf); 
} 

Это довольно очевидно, но, по существу, цель состоит в том, чтобы найти любые наборы, для которых результат это правда. Если он находит один, он возвращает true и переходит в блок if. Если он просматривает полный массив и не находит совпадений, он возвращает false.


Если вы ищете еще больше LINQ, а кто нет, это возможно чище. Можно утверждать.

if (Enumerable.Range(0, winningCombinations.GetLength(0)) 
       .Select(c => Enumerable.Range(0, winningCombinations.GetLength(1) 
            .Select(x => this.contentOf(winningCombinations[c, x]) 
       .Any(x => !x.Distinct().Skip(1).Any()) 
{ 
    _isDone = true; 
    _game.wonBy(_turnOf); 
} 

Сломанный немного,

// Get the indexes for of the array 
var ys = Enumerable.Range(0, winningCombinations.GetLength(0)); 
var xs = Enumerable.Range(0, winningCombinations.GetLength(1)); 

// Select the values at each index, becomes a collection of collections 
var vals = ys.Select(y => xs.Select(x => this.contentOf(winningCombinations[y, x])); 

// Discover whether at least one of the sets has exactly one value contained. 
return vals.Any(c => !x.Distinct().Skip(1).Any()) 
Смежные вопросы