【问题标题】:Cannot implicitly convert type 'int' to 'System.Collections.Generic.List<QuickTest.Stock>'无法将类型“int”隐式转换为“System.Collections.Generic.List<QuickTest.Stock>”
【发布时间】:2015-01-15 21:52:17
【问题描述】:

我有以下代码:

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

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

我编写的第二个 LINQ 语句引发了一条错误消息,“无法将类型 'int' 隐式转换为 'System.Collections.Generic.List'”。我对“int”类型的来源以及如何修复此错误感到困惑,因为我在程序中的任何地方都没有使用任何 int 值。

我对 LINQ 也很陌生,这是我第一次使用它。这个错误很可能是由于我不知道的一些复杂的 LINQ 造成的。

有人知道为什么会发生这个错误以及如何解决它吗?

【问题讨论】:

  • RemoveAll 不会返回新列表,它会修改现有列表并返回删除的记录数。
  • 您的第二个 LINQ 语句根本不是 LINQ 语句。它所做的只是在列表中调用RemoveAll
  • @dcastro 不是内联 LINQ 语句吗?
  • @mstagg 您可能正在谈论x =&gt; y 表达式。这称为 lambda 表达式,它是定义委托的语法,而不是 linq。 LINQ 简单来说就是为所有集合定义的一组扩展方法,例如 Select、Where、OrderBy。这些方法大量使用了 lambda 表达式和委托,为什么你可能会感到困惑

标签: c# linq list collections


【解决方案1】:

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

您可能想要删除其TickerSymbolgm 的所有股票,然后将它们留在股票行情中的股票写入控制台。为此,您可以尝试以下操作:

// 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&lt;T&gt;.RemoveAll()

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

签名如下:

public int RemoveAll(Predicate<T> match)

Predicate&lt;T&gt; 是一个方法的委托,如果传递给它的对象与委托中定义的条件匹配,则该方法返回 true。当前 List 的元素单独传递给 Predicate 委托,匹配条件的元素从 List 中移除

此方法执行线性搜索;因此,这种方法是一种 O(n) 运算,其中 n 是 List 的 Count 属性。

【讨论】:

  • 啊,谢谢。我不知道我怎么忽略了这一点。关于如何返回列表的新实例并删除指定对象的任何提示?
  • @mstagg 你欢迎老兄!我很高兴我提供了帮助。您可以在调用RemoveAll 后返回ticker。后者将删除所有您不想要的元素。
  • 做到了。谢谢! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多