集合中的过滤器c#
本文关键字:过滤器 集合 | 更新日期: 2023-09-27 18:04:26
我有一个c#集合例:
Collection<User> List = null;
我需要根据sum参数对其进行过滤。假设我想过滤掉userID在1到100之间的用户。
请告诉我如何在c#中做到这一点
谢谢Amit
假设您正在使用。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