LINQ:根据某些条件过滤项目列表,并按条件执行某些操作

时间:2018-03-21 14:41:11

标签: c# .net linq filtering

假设我users List<User>User类具有TypeAge属性。 我希望按某种条件过滤该用户列表,并根据条件对每个项目执行某些操作。让此列表包含10个用户,其中一些属于"complex"类型,其中一些"simple&#34;。我希望我的最终列表是年龄超过30岁的用户,如果用户类型为&#34;复杂&#34;,要对其执行某些操作,然后将其添加到最终列表中。它应该是这样的:

var users= users.Where(u => u.Age > 30 
and if u.Type = "complex" ? u = doSomething(u)).ToList();

如果doSomething(u)返回null,则跳过当前&#34; u&#34;被添加到列表中。

这是一半正确的代码,一半是伪代码,因为我不知道如何使if u.Type = "complex" ? u = doSomething(u)部分适合LINQ表达式。怎么办呢?

编辑:如果我想在Age&gt;的最终lsit用户中如何做到这一点30 OR用户类型=&#34;复杂&#34; (和复杂用户的doSomething())?

4 个答案:

答案 0 :(得分:3)

var users = users.Where(u => u.Age > 30) // common filter
                 .Select(u => u.Type == "complex" ? doSomething(u) : u) //select user or transformed
                 .Where(u => u != null) //not null only
                 .ToList();

答案 1 :(得分:0)

我会做以下事情:

users.Where(u => u.Age > 30).Select((u) =>
{
    if (u.Type == "complex")
    {
        // Do something
    }

    return u;
}).ToList();

选择所有年龄> gt的用户; 30然后根据类型属性更改结果。

编辑: 对于您的编辑问题,只需将条件添加到where:

[...].Where(u => u.Age > 30 || u.Type == "complex")[...]

答案 2 :(得分:0)

好吧,我想出了一些生病的变种......

public bool DoSomething()
{
    // Do anything
    return true;
}    

var v = users.Where(x => x!= null && x.Age > 30 && x.Type == "Complex" && x.DoSomething() == true).ToList();

为了您的编辑:

var v = users.Where(x => x!= null && (x.Age > 30 || x.Type == "Complex") && x.DoSomething() == true).ToList();

答案 3 :(得分:0)

AND QUERY

var andList = users.Where(u => u.Age > 30 && (u.Type == "complex" && doSomething(u) != null)).ToList();

OR QUERY

var orList = users.Where(u => u.Age > 30 || (u.Type == "complex" && doSomething(u) != null)).ToList();