List.clear()后跟List.add()不起作用

时间:2010-12-27 18:43:53

标签: c# linq list

我有以下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来分类我的卡好/坏?

6 个答案:

答案 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();
    }