C# 对列表应用自动和隐藏筛选<;T>;

C# 对列表应用自动和隐藏筛选<;T>;,c#,list,lambda,generic-list,C#,List,Lambda,Generic List,嗯 我有一个类MyClass和另一个基于List的类。让我们称之为我的收集 现在,当有人键入: MyCollection coll = new MyCollection(); ... coll.Find(...) 他们正在对整个藏品采取行动。我想在幕后应用一些过滤,这样,如果他们编写上述代码,实际执行的是 coll.Where(x=>x.CanSeeThis).Find(...) 我需要在MyCollection类的定义中写些什么才能使它起作用 我可以这样做吗?您可能想编写一个包装类,

我有一个类MyClass和另一个基于List的类。让我们称之为我的收集

现在,当有人键入:

MyCollection coll = new MyCollection();
...
coll.Find(...)
他们正在对整个藏品采取行动。我想在幕后应用一些过滤,这样,如果他们编写上述代码,实际执行的是

coll.Where(x=>x.CanSeeThis).Find(...)
我需要在MyCollection类的定义中写些什么才能使它起作用


我可以这样做吗?

您可能想编写一个包装类,在内部使用常规的
列表实现
IList
ICollection
。然后,此包装类将代理所有对内部列表的方法调用,并根据需要应用筛选器。

您可能希望编写一个包装类,在内部使用常规的
列表
实现
IList
ICollection
。然后,这个包装类将代理所有对内部列表的方法调用,并根据需要应用过滤器。

您已经提到您有自己的集合,可能是从列表派生的,对吗? 然后,您需要创建自己的方法来查找:

public class MyList<T> : System.Collections.Generic.List<T>
{
  public IEnumerable<T> MyFind(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }
}
public类MyList:System.Collections.Generic.List
{
公共IEnumerable MyFind(谓词匹配)
{
返回this.Where(x=>x.CanSeeThis.ToList().Find(match);
}
}
不幸的是,这是必需的,因为您不能直接重写List上的Find方法。但是,您可以使用“new”关键字指定,如果您获得了对MyList实例的引用,它将使用该find实现,如下所示:

  public new IEnumerable<T> Find(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }
public新IEnumerable查找(谓词匹配)
{
返回this.Where(x=>x.CanSeeThis.ToList().Find(match);
}
然而,上述示例将产生:

MyCollection<int> collection = new ...
collection.Find(myPredicate); // <= Will use YOUR Find-method

List<int> baseTypeCollection = collection; // The above instantiated
baseTypeCollection.Find(myPredicate); // Will use List<T>.Find!
MyCollection集合=新建。。。

collection.Find(myPredicate);// 您已经提到您有自己的收藏,可能来自列表,对吗? 然后,您需要创建自己的方法来查找:

public class MyList<T> : System.Collections.Generic.List<T>
{
  public IEnumerable<T> MyFind(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }
}
public类MyList:System.Collections.Generic.List
{
公共IEnumerable MyFind(谓词匹配)
{
返回this.Where(x=>x.CanSeeThis.ToList().Find(match);
}
}
不幸的是,这是必需的,因为您不能直接重写List上的Find方法。但是,您可以使用“new”关键字指定,如果您获得了对MyList实例的引用,它将使用该find实现,如下所示:

  public new IEnumerable<T> Find(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }
public新IEnumerable查找(谓词匹配)
{
返回this.Where(x=>x.CanSeeThis.ToList().Find(match);
}
然而,上述示例将产生:

MyCollection<int> collection = new ...
collection.Find(myPredicate); // <= Will use YOUR Find-method

List<int> baseTypeCollection = collection; // The above instantiated
baseTypeCollection.Find(myPredicate); // Will use List<T>.Find!
MyCollection集合=新建。。。

collection.Find(myPredicate);//嗯,好的。但是如果我想写一些东西,使/any/access通过我的过滤器访问列表,我就必须复制/替换/all/基类的那些方法,是吗?我想,仔细想想,我真正想要的是,我的集合的默认访问方法是过滤版本,以便它的用户可以使用。任何(…)让它对过滤后的数据集而不是原始数据进行操作。我想最好的方法是实现IList接口,然后使用一个包含数据的内部列表,然后使用过滤条件将任何参数过滤到列表的方法中。列表没有更具覆盖性,这真是一件痛苦的事,我自己也经历过:)这没那么痛苦——你用一种通用的方式这样做了一次,你就拥有了本来应该存在的可扩展集合类型。是的。你完全正确。。我只想休息一下喝杯咖啡,但。。没有一个程序员不承认自己有点懒:)嗯,好吧。但是如果我想写一些东西,使/any/access通过我的过滤器访问列表,我就必须复制/替换/all/基类的那些方法,是吗?我想,仔细想想,我真正想要的是,我的集合的默认访问方法是过滤版本,以便它的用户可以使用。任何(…)让它对过滤后的数据集而不是原始数据进行操作。我想最好的方法是实现IList接口,然后使用一个包含数据的内部列表,然后使用过滤条件将任何参数过滤到列表的方法中。列表没有更具覆盖性,这真是一件痛苦的事,我自己也经历过:)这没那么痛苦——你用一种通用的方式这样做了一次,你就拥有了本来应该存在的可扩展集合类型。是的。你完全正确。。我只想休息一下喝杯咖啡,但。。没有一个程序员不承认自己有点懒:)我想我只是想找到一种不用重新发明轮子就能把这个过滤器磨平的方法。我想我只是想找到一种不用重新发明轮子就能把这个过滤器磨平的方法。