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

问题描述 投票:0回答:4

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

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

如果doSomething(u)返回null,则跳过当前“u”以添加到列表中。

它是一半正确的代码,一半是伪代码,因为我不知道如何将if u.Type = "complex" ? u = doSomething(u)部分放入LINQ表达式。怎么做到呢?

编辑:如果我想在年龄> 30的最终列表用户或复杂用户使用Type =“complex”(和doSomething())的用户,该如何做?

c# .net linq filtering
4个回答
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();

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

0
投票

我会做以下事情:

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

    return u;
}).ToList();

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

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

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

0
投票

和查询

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

或者查询

var orList = users.Where(u => u.Age > 30 || (u.Type == "complex" && doSomething(u) != null)).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.