即使在实现IEnumerable时也没有显示扩展方法

时间:2015-10-22 15:07:26

标签: c# .net linq

这是我的代码:

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

在我创建此类的对象并以此方式使用它的情况下,我没有获得WhereCount等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;

enter image description here

如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

工作。 AsParallelIEnumerable上的扩展方法。大多数扩展方法虽然适用于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>正是您要找的。