Найти все объекты в списке <T>с одинаковым значением свойства - PullRequest
1 голос
/ 20 февраля 2011

У меня есть класс Card, у которого есть свойство Rank (1,2,3 и т. Д.), И у меня есть список карт, и я хочу найти все карты с одинаковым значением Rank в этом списке.

Список карт отсортирован по рангу заранее.

Какой бы быстрый способ в .NET (используя LINQ, если возможно) найти все объекты с одинаковым значением свойства.

Я не знаю, какое значение свойства заранее, поэтому мне нужно пройти и сравнить. До сих пор я зацикливался и держал ссылки на предыдущие объекты для сравнения, но мне было интересно, если нет более простого способа сделать это?

Дело в том, что мне нужно найти N элементов в списке с одинаковым значением свойства.

Может и не быть, но я думал, что все еще спрашиваю.

Ответы [ 4 ]

2 голосов
/ 20 февраля 2011

Вы можете сгруппировать карты по рангу:

public class Card
{
    public int Rank { get; set; }
}

class Program
{
    static void Main()
    {
        var cards = new[] 
        {
            new Card { Rank = 1 },
            new Card { Rank = 2 },
            new Card { Rank = 3 },
            new Card { Rank = 2 },
            new Card { Rank = 1 },
        };

        var groups = cards.GroupBy(x => x.Rank);
        foreach (var group in groups)
        {
            Console.WriteLine("Cards with rank {0}", group.Key);
            foreach (var card in group)
            {
                Console.WriteLine(card.Rank);
            }
        }
    }
}
0 голосов
/ 20 февраля 2011

Привет, Тони, ты ищешь что-то, связывающее это?

List<Card> rankedCards = cards.Where(o=> o.Rank == rank).ToList()

Это должно вернуть список карт, которые соответствуют переменной "rank", которая, как я полагаю, содержит int, содержащий значение ранга, которое ты хочешьчтобы соответствовать.

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

Использование Enumerable.ToLookup. Карты не нужно предварительно сортировать.

Если у вас есть класс

public class Card
{
    public string Name { get; set; }
    public int Rank { get; set; }
}

Затем вы можете создать Lookup, который группирует по Rank, как это

var cards = new Card[]{
    new Card{Rank = 1, Name = "A"},
    new Card{Rank = 1, Name = "B"},
    new Card{Rank = 2, Name = "C"},
    new Card{Rank = 3, Name = "D"},
};

var cardsByRank = cards.ToLookup(card => card.Rank);

foreach (var cardRankGroup in cardsByRank)
{
    Console.WriteLine("KEY: " + cardRankGroup.Key);

    foreach (var card in cardRankGroup)
    {
        Console.WriteLine("   Card: " + card.Name);
    }
}

с выводом

KEY: 1
   Card: A
   Card: B
KEY: 2
   Card: C
KEY: 3
   Card: D

Редактировать
если вы хотите извлечь все карты для данного ранга, вы можете использовать ранг в качестве индекса для поиска

foreach (var card in cardsByRank[2])
{
    Console.WriteLine("   Card: " + card.Name);
}
0 голосов
/ 20 февраля 2011

проще всего будет использовать linq

var results = myCardList.Select( c=>c.rank == myRank );

, тогда вы можете выполнить итерацию или преобразовать в список.

...