LINQ запрос не удался - PullRequest
       1

LINQ запрос не удался

0 голосов
/ 22 февраля 2011

У меня есть карта класса, которая содержит ссылку на перечисление с различными типами карт.Перечисление определяется следующим образом:

 enum Rank
    {
        Ace = 1,
        Two,
        Three,
        Four,
        Five,
        Six,
        Seven,
        Eight,
        Nine,
        Ten,
        Jack,
        King,
        Queen
    }

У меня есть запрос LINQ, который должен взять список и проверить, есть ли они в последовательности.Таким образом, это означает, что разница между любыми двумя рангами составляет всего 1.

Запрос:

List<Card> cards = group.ToList();
cards.Sort(SortComparatorByRank);
List<Card> test = cards.Where((x, idx) =>
            (idx >= 1 && (int)cards[idx - 1].CardRank == (int)x.CardRank - 1 ||
            (idx < cards.Count() - 1 &&
            (int)cards[idx + 1].CardRank == (int)x.CardRank + 1))).ToList();

Однако при выполнении этого я получаю следующий результат: items in list after running query...

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

В списке, приведенном к этому запросу, не все карты, поэтому мне нужно проверить порядок ранжирования и т. д. ...

Ответы [ 3 ]

5 голосов
/ 22 февраля 2011

Нет, это не показывает, что Два и Четыре предположительно следуют друг за другом.Предполагается, что Three не присутствовал в cards.

Two, пропускает первую часть фильтра из-за Ace, предшествующего ему, и Four, пропускает вторую часть фильтра из-зак Five после него.

Учитывая, что вы пытаетесь проверить, все ли в порядке, похоже, что вы действительно хотите, чтобы что-то возвращало bool - для чего я бы предложил All.Вы также хотите только их попарно, поэтому я бы рассмотрел что-то вроде:

var valid = cards.Zip(cards.Skip(1), (first, second) => new { first, second })
                 .All(pair => pair.first.CardRank == pair.second.CardRank - 1);
0 голосов
/ 22 февраля 2011

При вызове карточек. Сортировка: вы выполняете сортировку, но не настраиваете новый список обратно на указатель карточек.

Попробуйте сделать карточку = cards.Sort (во второй строкекод).

0 голосов
/ 22 февраля 2011
 (idx < cards.Count() - 1 &&
 (int)cards[idx + 1].CardRank == (int)x.CardRank + 1))).ToList();

Он соединяет четыре с пятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...