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'是一个类
注:你最近编辑了你的问题,说明了真正的问题,这可能会使这个答案过时。我已经发布了一个新的,以解决"真正的"问题。
-
确保您的项目有
System.Core.dll
的引用。这是。net程序集,它包含LINQ的扩展方法,适用于几乎任何集合类型。(这包括
Select
,你不能找到SortedList
。Select
实际上是静态类System.Linq.Enumerable
中的静态方法) -
确保您至少有以下两个
using
指令(您已经这样做了):using System.Collections; // makes referring to SortedList easier using System.Linq; // required for the Select method
-
由于
SortedList
是一个非泛型和非类型集合,即它只包含object
s,为了使用LINQ的Select
方法和/或访问元素的Value
属性,你首先需要调用LINQ的Cast<T>
操作符。试试这个:var result = sortedList.Cast<TItem>().Select(x => new { x.Value.MyProperty, x.Value.AnotherProperty });
其中
TItem
是SortedList
中项目类型的名称。
注::我假设在您的示例中SortedList
指的是局部变量,或字段或属性,而不是用作类型名称。这就是为什么我把大写改为sortedList
。
P.P.S.:除非您有很好的理由不这样做,否则使用System.Collections.Generic.SortedList<TKey, TValue>
类可能会更容易一些,就像这里的其他人在我之前已经建议的那样。
注:我把这个作为一个全新的答案发布,因为最近对你的问题的编辑已经清楚地表明,真正的问题与最初看起来的大不相同。
-
从
data
中选择您想要的SortedList<…>
子集:var subset = data.Where(x => x.Key >= startDate && x.Key <= endDate);
-
从过滤项构建一个新的
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并没有实现这个接口