SortedList错误:"不包含选择"的定义

本文关键字:quot 选择 定义 包含 错误 SortedList | 更新日期: 2023-09-27 18:05:18

以下链接建议使用这种语法:

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

其中'data'为

SortedList<DateTime, BarData> 

'barData'是一个类

SortedList错误:"不包含选择"的定义

注:你最近编辑了你的问题,说明了真正的问题,这可能会使这个答案过时。我已经发布了一个新的,以解决"真正的"问题。


  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中项目类型的名称。

注::我假设在您的示例中SortedList指的是局部变量,或字段或属性,而不是用作类型名称。这就是为什么我把大写改为sortedList

P.P.S.:除非您有很好的理由不这样做,否则使用System.Collections.Generic.SortedList<TKey, TValue>类可能会更容易一些,就像这里的其他人在我之前已经建议的那样。

注:我把这个作为一个全新的答案发布,因为最近对你的问题的编辑已经清楚地表明,真正的问题与最初看起来的大不相同。

  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<…>中。

何时使用Where,何时使用Select:

  • 使用Where当你想找到一个子集,即。当您想要"过滤"一个集合时。(如果你熟悉SQL, Where对应于WHERE,因此得名)

  • 使用Select当你想改变/转换,或"项目",一个集合的每个元素到其他东西。在函数式编程中,这个操作通常被称为"映射"。(同样,如果你很了解SQL,那么Select —意料之中的是本;对应SELECT)

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

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

这是c#允许的一些语法糖,但本质上意味着相同的事情(然而在这种形式下,select不能被省略,即使它实际上不做任何投影)。再次注意与SQL的相似性!

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

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

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