Linq-Connection用于数据结构

时间:2014-08-14 19:43:16

标签: c# linq data-structures

我最近设计了一个类似于'Queue'和'Stack'的数据结构,用于特殊目的,其中包含固定的最大对象数,当它完整并插入时,第一个插入的对象就会丢失。

守则:

public class AssemblyLine<T>
{      

    private long length;
    public long Length { get { return this.length; } }

    private T[] data;
    private long Pointer = 0;

    private long count = 0;
    public long Count { get { return this.count; } }

    public void Insert(T obj)
    {

        this.Data[Pointer] = obj;
        this.Next();

        if (this.count < this.length)
            this.count++;

    }

    public T[] GetLastX(long x)
    {

        long p = this.Pointer;

        if (x > this.count)
            x = this.count;

        T[] result = new T[x];
        for (int i = 0; i < x; i++)
        {

            Previous();
            result[i] = Grab();

        }

        this.Pointer = p;
        return result;

    }

    public T[] GetFirstX(long x)
    {

        long p = this.Pointer;

        if (x > this.count)
            x = this.count;

        long gap = this.length - this.count;
        this.Pointer = (this.Pointer + gap) % this.length;

        T[] result = new T[x];
        for (int i = 0; i < x; i++)
        {

            result[i] = Grab();
            Next();

        }

        this.Pointer = p;
        return result;

    }

    public void Clear()
    {

        this.data = new T[this.length];
        this.count = 0;

    }

    private void Next()
    {

        this.Pointer++;

        if (this.Pointer > this.length - 1)
            this.Pointer = 0;

    }

    private void Previous()
    {

        this.Pointer--;

        if (this.Pointer < 0)
            this.Pointer = this.length - 1;

    }

    private T Grab()
    {

        return this.data[this.Pointer];

    }

    public AssemblyLine(long Length)
    {

        this.length = Length;
        this.data = new T[Length];

    }

}

现在我很好奇是否可以将其连接到Linq,提供类似这样的内容:

  AssemblyLine<int> myAssemblyLine = new AssemblyLine(100);

  // Insert some Stuff

  List<int> myList = myAssemblyLine.Where(i => i > 5).ToList();

有人在想吗?

2 个答案:

答案 0 :(得分:1)

几乎所有LINQ扩展方法都在IEnumerable<T>上声明,因此只要您的类实现了该接口,您就可以免费获得它。

只有几种方法使用非通用IEnumerable,例如CastOfType,但是如果你可以让你的类实现泛型IEnumerable<T>那么它会很多更好的是,因为用户不必首先调用Cast<T>,获取IEnumerable<T>并访问所有其他方法(现在就是某些旧版集合的情况)。

答案 1 :(得分:1)

你必须为.Where()实现IEnumerable<T>。请参阅Adding LINQ to my classes

实施IEnumerable<T>和所有必需的方法后,您将可以访问这些方法:http://msdn.microsoft.com/en-us/library/vstudio/system.linq.enumerable_methods(v=vs.100).aspx