以下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'是一个类
答案 0 :(得分:3)
注意:您最近编辑过您的问题,说明真正的问题,这可能会导致此答案过时。我发布了一个新问题来解决“真正的”问题。
确保您的项目引用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
中项目类型的名称。
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)
注意:我将此作为一个全新的答案发布,因为最近对您的问题的编辑清楚地表明,真正的问题与它最初看起来完全不同。
在结果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
。)最后,请记住,您可以写下:{/ 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没有实现这个接口。