这是我的代码:
class myClass : IEnumerable
{
public Dictionary<int, string> dctIdName = new Dictionary<int, string>();
public myClass()
{
for (int idx = 0; idx < 100; idx++)
{
dctIdName.Add(idx, string.Format("Item{0}", idx));
}
}
// IEnumerable Member
public IEnumerator GetEnumerator()
{
foreach (object o in dctIdName)
{
yield return o;
}
}
}
在我创建此类的对象并以此方式使用它的情况下,我没有获得Where
,Count
等LINQ扩展方法。
myClass obj = new myClass();
var d = obj.Where( x => x.Key == 10); //<-- Error here
我包含的名称空间是:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
如何解决这个问题?
答案 0 :(得分:6)
工作。 AsParallel
是IEnumerable
上的扩展方法。大多数扩展方法虽然适用于IEnumerable<T>
。你的课应该从这开始:
class myClass : IEnumerable<SomeType>
或者:
class myClass<T> : IEnumerable<T>
(其中T
是泛型类型参数的类型)
class myClass : IEnumerable<KeyValuePair<int, string>>
{
public Dictionary<int, string> dctIdName = new Dictionary<int, string>();
public myClass()
{
for (int idx = 0; idx < 100; idx++)
{
dctIdName.Add(idx, string.Format("Item{0}", idx));
}
}
// IEnumerable Member
public IEnumerator<KeyValuePair<int, string>> GetEnumerator()
{
foreach (KeyValuePair<int, string> o in dctIdName)
{
yield return o;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
现在你可以打电话给Select
了。
答案 1 :(得分:2)
您需要实现IEnumerable的通用版本。我猜你的情况会是:
IEnumerable<KeyValuePair<int, string>>
或
IEnumerable<object>
答案 2 :(得分:2)
.NET Framework仅为IEnumerable
AsParallel() - 启用查询的并行化。(由ParallelEnumerable定义。)
AsQueryable() - 将IEnumerable转换为IQueryable。(由Queryable定义。)
Cast() - 将IEnumerable的元素转换为指定的类型。(由Enumerable定义。)
OfType() - 根据指定的类型过滤IEnumerable的元素。(由Enumerable定义。)
IEnumerable<T>
正是您要找的。 p>