SortedList出错:“不包含Select的定义。”

时间:2011-08-12 16:52:48

标签: c# linq

以下link建议使用以下语法:

var result = SortedList.Select(x => new { 
    x.Value.MyProperty, 
    x.Value.AnotherProperty 
});

但是,当我尝试测试它时,我收到错误:

  

System.Collections.SortedList不包含Select的定义。

我有以下参考资料:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.IO;

尽管进行了广泛的互联网搜索,但我无法弄清楚如何解决这个问题。有人可以帮忙吗?

修改 也许我会说错了。我的目标是将SortedList的子集作为SortedList返回。

var subset = data.Where(x => x.Key >= startDate && x.Key <= endDate); 

其中'数据'是

SortedList<DateTime, BarData> 

'barData'是一个类

4 个答案:

答案 0 :(得分:3)

  

注意:您最近编辑过您的问题,说明真正的问题,这可能会导致此答案过时。我发布了一个新问题来解决“真正的”问题。


  1. 确保您的项目引用System.Core.dll。这是.NET程序集,它包含几乎所有集合类型的LINQ扩展方法。

    (这包括Select找不到的SortedListSelect实际上是静态类System.Linq.Enumerable中的静态方法。)

  2. 确保您至少拥有以下两个using指令(您已经这样做):

    using System.Collections;  // makes referring to SortedList easier
    using System.Linq;         // required for the Select method
    
  3. 由于SortedList是非通用且无类型的集合,即。它只包含object s,为了使用LINQ的Select方法和/或访问元素'Value属性,首先需要调用LINQ的Cast<T>运算符即可。试试这个:

    var result = sortedList.Cast<TItem>().Select(x => new { 
        x.Value.MyProperty, 
        x.Value.AnotherProperty 
    });
    

    其中TItemSortedList中项目类型的名称。

  4. P.S。:我假设您的示例中的SortedList引用了局部变量,字段或属性,并且未用作类型名称。这就是为什么我将大写更改为sortedList

    PPS:除非你有充分的理由不这样做,否则如果你使用System.Collections.Generic.SortedList<TKey, TValue>课程,生活可能会容易一些,因为这里的其他人已经在我面前提出过建议。

答案 1 :(得分:1)

看起来你正在使用SortedList作为静态类,或者你的对象被命名为与类相同。无论如何,这应该工作:

var myList = new SortedList<int, int>();
var mySelect = myList.Select(x => x.Value);

答案 2 :(得分:1)

  

注意:我将此作为一个全新的答案发布,因为最近对您的问题的编辑清楚地表明,真正的问题与它最初看起来完全不同。

  1. 在结果data中选择您想要的SortedList<…>子集:

    var subset = data.Where(x => x.Key >= startDate && x.Key <= endDate); 
    
  2. 从过滤的项目中构建新的SortedList

    var sortedListSubset = new SortedList<DateTime, BarData>();
    
    foreach (var subsetItem in subset)
    {
        sortedListSubset.Add(subsetItem.Key, subsetItem.Value);
    }
    

    我没有看到更简单的解决方案。问题是Enumerable.Where会返回IEnumerable<KeyValuePair<DateTime, BarData>>,并且没有将其转换回SortedList<…>的扩展方法。因此,需要逐项遍历IEnumerable<…>项并将其添加到新的SortedList<…>

  3.   

    何时使用Where以及何时使用Select

         
        
    • 每当您想要查找子集时使用Where,即。当你想“过滤”一个集合。 (如果您熟悉SQL,Where对应WHERE,因此就是名称。)

    •   
    • 如果要将集合中的每个元素更改/转换或“投影”为其他内容,请使用Select。在函数式编程中,此操作通常称为“映射”。 (同样,如果您熟悉SQL,那么Select - 毫不奇怪 - 对应于SELECT。)

    •   
         

    最后,请记住,您可以写下:{/ 1>而不是data.Where(x => x.Key >= …)

     var subset = from x in data 
                  where x.Key >= … 
                  select x
    
         

    这是C#允许的一些语法糖,但实际上意味着相同的东西(但是在这种形式中,select不能被省略,即使它没有真正做任何投影)。再次注意与SQL的相似性!

答案 3 :(得分:0)

LINQ Select方法接收IEnumerable。但是SortedList没有实现这个接口。