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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ:根据某些条件过滤项目列表,并按条件执行某些操作相关的知识,希望对你有一定的参考价值。

假设我有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())的用户,该如何做?

答案
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();
另一答案

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

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();
另一答案

我会做以下事情:

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")[...]
另一答案

和查询

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

以上是关于LINQ:根据某些条件过滤项目列表,并按条件执行某些操作的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:根据某些条件过滤列表

如何根据多个条件并使用 linq 从通用列表中删除项目

条件Linq查询

如何有条件地应用 Linq 运算符?

如何根据某些过滤条件从 bigquery 导出数据

如何使用条件过滤字典值列表