【问题标题】:Error on applying linq to List将 linq 应用于列表时出错
【发布时间】:2015-07-17 15:40:55
【问题描述】:

我正在尝试使用 linq 从更大的列表中创建子列表

List<ScenarioDetailModel> chartScenarioDetailsList = new List<ScenarioDetailModel>();

List<ScenarioDetailModel> subList = new List<ScenarioDetailModel>();
subList = chartScenarioDetailsList.Where(s => s.Code == "C3");

chartScenarioDetailsListsubList都是同一个类型但是编译器报错类型转换不能编译,错误如下:

错误 190 无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)

但是,当我将子列表的类型从 List 更改为 IEnumerable 时,它会编译:

IEnumerable<ScenarioDetailModel> subList = new List<ScenarioDetailModel>();
subList = chartScenarioDetailsList.Where(s => s.Code == "C3");

我的问题是:为什么会这样?

【问题讨论】:

  • 尝试在 where 语句的末尾添加.ToList()。因为它返回一个可枚举的,而不是一个列表
  • 另一个问题是:你真的需要一个列表还是可以使用一个可枚举的? apply ToList() 意味着创建一个新对象并引用另一个对象的元素。

标签: c# linq ienumerable


【解决方案1】:

Where() 确实返回 IEnumerable,而不是 List。

试试subList = chartScenarioDetailsList.Where(s =&gt; s.Code == "C3").ToList();

另外,你应该直接分配 subList

chartScenarioDetailsList.Where(s =&gt; s.Code == "C3").ToList();

而不是 new,因为这样做会丢失调用 new 创建的引用。

【讨论】:

    【解决方案2】:

    var subList = chartScenarioDetailsList.FindAll(s =&gt; s.Code == "C3");

    但是你真的应该接受IEnumerable 的概念,正如其他人在 cmets 和答案中所建议的那样:

    // I temporarily need a local sub-list to do something
    // Approach 1 (older list approach)
    
    { // scope of subList
        var subList = chartScenarioDetailsList.FindAll(s => s.Code == "C3");
        foreach (var detail in subList)
        { /* do a thing with detail */ }
    } // end of scope
    
    // Approach 2 (enumerable approach)
    
    foreach (var detail in chartScenarioDetailsList.Where(s => s.Code == "C3"))
    { /* do a thing with detail */ }
    

    如果您对子列表的使用是即时和临时的,您可以完全跳过它,只需遍历 Where 结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多