在List <t>中查找具有相同属性值</t>的所有对象

时间:2011-02-20 17:53:24

标签: search c#-4.0 comparison

我有一张类卡,它有属性等级(1,2,3等),我有一张卡片列表,我希望在该列表中找到所有具有相同等级值的卡片。

卡片列表事先按等级排序。

在.NET(使用LINQ,如果可能)中找到具有相同属性值的所有对象的禁区方式是什么。

我事先不知道属性值是什么,所以我必须经历并进行比较。到目前为止,我一直在循环并保持对以前对象的引用进行比较,但我想知道是否有更简单的方法来做到这一点?

要点是我需要能够在具有相同属性值的列表中找到N个元素。

可能没有,但我想我还是会问。

4 个答案:

答案 0 :(得分:2)

您可以按照排名对卡进行分组:

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);
            }
        }
    }
}

答案 1 :(得分:0)

最简单的方法是使用linq

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

然后你可以迭代或转换成列表。

答案 2 :(得分:0)

使用Enumerable.ToLookup。这些卡片不需要事先分类。

如果你有一个班级

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

然后,您可以创建一个按照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

修改
如果你想提取给定Rank的所有牌,你可以使用rank作为查找的索引

foreach (var card in cardsByRank[2])
{
    Console.WriteLine("   Card: " + card.Name);
}

答案 3 :(得分:0)

嘿Tony,你在寻找链接吗?

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

这应该返回一个与变量“rank”匹配的卡片列表,我假设它包含一个包含你想要匹配的Rank值的int。