无法将类型'int'隐式转换为'System.Collections.Generic.List<QuickTest.Stock>'。

7

我有以下代码:

static void Main(string[] args)
    { 
        List<Stock> ticker = new List<Stock>();
        ticker.Add(new Stock("msft"));
        ticker.Add(new Stock("acw"));
        ticker.Add(new Stock("gm"));

        ticker = ticker.OrderBy(s => s.Name).ToList();

        foreach (Stock s in ticker)
        {
            Console.WriteLine(s.Name);
        }

        Console.WriteLine("\n");
        ticker = ticker.RemoveAll(s => s.TickerSymbol == "gm");

        foreach (Stock s in ticker)
        {
            Console.WriteLine(s.Name);
        }
    }

股票是一个具有字符串属性TickerSymbol和Name的对象。它还具有双重属性价格、ChangeDollars和ChangePercent。

我编写的第二个LINQ语句出现了错误,错误消息为“无法隐式转换类型'int'为'System.Collections.Generic.List'”。我不明白'int'类型从何而来,也不知道如何修复此错误,因为程序中没有使用任何'int'值。

我对LINQ非常陌生,这是我第一次使用它。这个错误很可能是因为我不知道的LINQ某些复杂性引起的。

有人知道为什么会发生这种错误以及如何修复它吗?


1
"RemoveAll" 不会返回一个新的列表,它会修改现有的列表并返回被删除的记录数。 - Habib
你的第二个LINQ语句根本不是一个LINQ语句。它只是在列表上调用RemoveAll函数。 - dcastro
@dcastro 这不是一个内联的LINQ语句吗? - mstagg
@mstagg,你可能在谈论 x => y 表达式。这被称为 Lambda 表达式,它是一种用于定义委托的语法,而不是 LINQ。简单来说,LINQ 是所有集合定义的一组扩展方法,例如 Select、Where、OrderBy。这些方法大量使用了 Lambda 表达式和委托,这也可能会让你感到困惑。 - dcastro
1个回答

11

你得到的错误是合理的,因为RemoveAll返回已删除的股票数量,这是一个整数。 然后,您尝试将其分配给名为ticker的变量,该变量保存类型为Stock的对象列表。

您可能想要做的是删除所有其TickerSymbolgmStocks,然后将剩下的Stocks写入控制台中的ticker。 为此,您可以尝试以下操作:

// This will remove all the stocks you want.
ticker.RemoveAll(s => s.TickerSymbol == "gm");

foreach (Stock s in ticker)
{
    Console.WriteLine(s.Name);
}

此外,据MSDN所述:

List<T>.RemoveAll()方法:

删除符合指定条件的所有元素。

其签名如下:

public int RemoveAll(Predicate<T> match)

Predicate<T>是一个委托,它引用一个方法,如果传递给它的对象符合委托中定义的条件,则返回true。当前List的元素将被单独传递给Predicate委托,匹配条件的元素将从List中移除。该方法执行线性搜索;因此,该方法的时间复杂度为O(n),其中n是List的Count属性。


啊,谢谢。我不知道我怎么会忽略那个。你有什么提示可以返回一个新的列表实例并删除指定的对象吗? - mstagg
@mstagg,不客气!我很高兴能帮到你。在调用RemoveAll之后,你可以直接返回ticker。后者将删除所有不需要的元素。 - Christos
搞定了。谢谢!+1 - mstagg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接