我有以下C#类/功能:
class Hand
{
private List<Card> myCards = new List<Card>();
public void sortBySuitValue()
{
IEnumerable<Card> query = from s in myCards
orderby (int)s.suit, (int)s.value
select s;
myCards = new List<Card>();
myCards.AddRange(query);
}
}
在纸牌游戏上。这很好,但是,我一开始遇到麻烦,而不是使用myCards = new List();重置&#39; myCards,我会使用myCards.clear(),但是,一旦我调用了clear函数,我将无法调用myCards.add()或myCards.addRange()。计数将保持为零。我目前的做法好吗?使用LINQ来分类我的卡好/坏?
答案 0 :(得分:4)
这会起作用
class Hand
{
private List<Card> myCards = new List<Card>();
public void sortBySuitValue()
{
myCards = (from s in myCards
orderby (int)s.suit, (int)s.value
select s).ToList();
}
}
答案 1 :(得分:2)
问题是IEnumerable
是查询,而不是列表。由于它是从myCards
中选择的,如果在实际执行查询之前清除myCards
,它将不会返回任何结果。您可以在使用IEnumerable.ToList()
清除列表之前运行查询:
public void sortBySuitValue()
{
var query = (from s in myCards
orderby (int)s.suit, (int)s.value
select s).ToList();
myCards.Clear();
myCards.AddRange(query);
}
答案 2 :(得分:1)
您不需要LINQ进行排序,List类已经提供了一个Sort方法,您可以传递适合您的Comparison
委托。
按长度排序字符串的示例:
List<string> myList = new List<string>( new string[] { "foo", "bar" } );
myList.Sort((x, y) =>
{
if (x.Length == y.Length)
return 0;
else if (x.Length < y.Length)
return 1;
else return -1;
});
答案 3 :(得分:0)
您可以使用LINQ生成查询以创建新列表(或重新填充已清除的列表),但我宁愿使用Sort
List<T>
实例方法在这种特殊情况下,继续对我现有的列表进行排序。
List<Card> myCards = SomeMethodGeneratingCards();
Comparison<Card> cardComparison = (card1, card2) =>
{
int value = card1.Suit.CompareTo(card2.Suit);
if (value == 0)
value = card1.Value.CompareTo(card2.Value);
return value;
};
myCards.Sort(cardComparison);
答案 4 :(得分:0)
您可以在列表中对数据进行排序:
myCards.Sort( (l,r) =>
l.suit.Equals(r.suit) ? l.value.CompareTo(r.value) : l.suit.CompareTo(r.suit));
这样您就不必创建分配给旧变量的新列表。
答案 5 :(得分:0)
要myCards
填充了LINQ需要调用某些方法的信息,例如.ToList()
如果不这样,myCards将不包含任何内容。
这应该有效:
class Hand
{
private List<Card> myCards = new List<Card>();
public void sortBySuitValue()
{
myCards = (from s in myCards
orderby (int)s.suit, (int)s.value
select s).ToList();
}