过滤集合c#

时间:2011-08-03 09:46:14

标签: c# asp.net

我在c#中有一个集合 例如:

Collection<User> List = null;

我需要根据sum参数对其进行过滤。所以我想说我想过滤掉用户ID在1到100之间的用户。

请在c#

中建议我如何做到这一点

由于 阿米特

7 个答案:

答案 0 :(得分:3)

假设您使用的是.NET 3.5或更高版本,并且您不需要过滤到位,只需使用LINQ:

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

请注意,这会过滤 out 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>编写,从而为您提供更大的灵活性。

答案 1 :(得分:1)

假设列表不为空...

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

但是这很明显我想知道我是否正确地理解了这个问题......

答案 2 :(得分:0)

Linq对此有扩展,例如

var FilteredList = list.where(item => item >= 1 && item < 100);

答案 3 :(得分:0)

List<users> Users = new myspeciallist()
list.Addrange(Users.Where(z => userID < 101))

答案 4 :(得分:0)

您还可以考虑实施specification pattern的变体形式。如果您的业务规则要求发生变化,优点是与用户类分离,并且易于更改。这并不难。

规范模式的一个特意小的例子(有很多改进的空间,例如复合规范类,除了可枚举的规范作为构造函数或单个规范,基本上像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))
        ...;
}

答案 5 :(得分:0)

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);

答案 6 :(得分:0)

var sds = from s in list where s.ProdId > 1 && s.ProdId < 100 select s