集合中的过滤器c#

本文关键字:过滤器 集合 | 更新日期: 2023-09-27 18:04:26

我有一个c#集合例:

Collection<User> List = null;

我需要根据sum参数对其进行过滤。假设我想过滤掉userID在1到100之间的用户。

请告诉我如何在c#中做到这一点

谢谢Amit

集合中的过滤器c#

假设您正在使用。net 3.5或更高版本,并且您不需要在位置设置过滤器,只需使用LINQ:

var filteredUsers = unfilteredUsers.Where(u => u.UserID < 1 || u.UserID > 100)
                                   .ToList();

请注意,这是将从id在1到100之间的用户中过滤出来,而不是按照其他答案在中过滤

如果没有帮助,请澄清问题。(出于兴趣,为什么要从Collection<T>开始?)

编辑:如果你真的

需要一个Collection<T>,你可以很容易地创建一个:

var filteredUsers = new Collection<User>
       (unfilteredUsers.Where(u => u.UserID < 1 || u.UserID > 100)
                       .ToList());

您甚至可以添加自己的ToCollection扩展方法来简化此操作。但是Collection<T>通常意味着是更具体的集合类型(例如ObservableCollection<T>)的基类-直接构造一个是奇怪的。如果您的API是根据Collection<T>编写的,那么您应该将其更改为根据IList<T>编写的,从而提供更大的灵活性。

假设列表不为空…

List.Where(u=>u.userId >=1 && u.userId <=100)

但这是如此明显,我想知道我是否理解正确的问题…

Linq有相应的扩展,例如

var FilteredList = list.where(item => item >= 1 && item < 100);
List<users> Users = new myspeciallist()
list.Addrange(Users.Where(z => userID < 101))
List<User> lst = null; //ATTENTION! you need to initialize a REAL collection here
List<User> myList = lst.FindAll(x=>x.userID>0 and x.userID<101);

您还可以考虑实现规范模式的一个变体。优点是与User类解耦,并且在业务规则需求发生变化时易于更改。这并不难做。

规范模式的一个很小的例子(有很多改进的空间,比如一个复合规范类,除了可枚举的规范作为构造函数或单个规范,本质上是像Linq-to-XML那样将它们组合在一起!)可以将它们设置为静态,从另一个程序集读取它们等等)

public class User
{
    public string name { get; set; }
    public string userID {get;set; }
}
public interface ISpecification<T>
{
    boolean IsSatisfiedBy(T obj);
}
public class IdValidUserSpecification : ISpecification<User>
{
    public boolean IsSatisfiedBy(User user)
    {
         return user.userID >= 101 || user.userID < 1;
    }
}
public class NameLongEnoughUserSpecification : ISpecification<User>
{
    public boolean IsSatisfiedBy(User user)
    {
         return user.Name.Length > 10;
    }
}
...     
public void DoSomething()
{
    ISpecification<User> idValid = new IdValidUserSpecification();
    ISpecification<User> nameValid = new NameLongEnoughUserSpecification();
    User user = new User();
    user.name = "Jaapjan";
    user.userID = 101;
    if (nameValid.IsSatisfiedBy(user) && idValid.IsSatisfiedBy(user))
        ...;
}
var sds = from s in list where s.ProdId > 1 && s.ProdId < 100 select s