我最近设计了一个类似于'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();
有人在想吗?
答案 0 :(得分:1)
几乎所有LINQ扩展方法都在IEnumerable<T>
上声明,因此只要您的类实现了该接口,您就可以免费获得它。
只有几种方法使用非通用IEnumerable
,例如Cast
或OfType
,但是如果你可以让你的类实现泛型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