我有一张类卡,它有属性等级(1,2,3等),我有一张卡片列表,我希望在该列表中找到所有具有相同等级值的卡片。
卡片列表事先按等级排序。
在.NET(使用LINQ,如果可能)中找到具有相同属性值的所有对象的禁区方式是什么。
我事先不知道属性值是什么,所以我必须经历并进行比较。到目前为止,我一直在循环并保持对以前对象的引用进行比较,但我想知道是否有更简单的方法来做到这一点?
要点是我需要能够在具有相同属性值的列表中找到N个元素。
可能没有,但我想我还是会问。
答案 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。