在 C# 中的列表内过滤 - 根据 where 条件选择

Posted

技术标签:

【中文标题】在 C# 中的列表内过滤 - 根据 where 条件选择【英文标题】:filter inside list in C# -Select based on where condition 【发布时间】:2021-06-25 19:16:22 【问题描述】:

我有一个回应 LIST<ValidationModel> validationDto;

我想返回带有视图列表的 LIST<ValidationModel> 仅包含 gtype=health 的位置

我做了以下事情 returnResult = validationDto.Where(a => a.Views.Any(i => i.gType == "health")).ToList(); 但没有运气。

有人可以帮忙吗?

public class ValidationModel

    public MetadataDto Metadata  get; set; 
    public string Type  get; set; 
    public string PId  get; set; 
    public List<ListView> ListViews  get; set; 


public partial class ListView

    public string EType  get; set; 
    public string VName  get; set; 
    public string FName  get; set; 
    public string FType  get; set; 
    public string Path  get; set; 
    public string GType  get; set; 
    public string Enabled  get; set; 
    public bool IsTrue  get; set; 

【问题讨论】:

您能详细说明“没有运气”是什么意思吗?能否提供样本数据和预期结果? John,ListView 是 ValidationModel 中的一个列表。现在我想返回 Listview 仅包含 gtype=="health" 的 validarionModel 列表 你已经说过了。您描述为“不走运”的代码有什么问题?它不编译吗?抛出异常?返回太多数据?太少了?请明确说明问题。 它返回了所有的 ListView 数据,其中 gtype!="heatlh" 也是。这意味着查询不正确 您是说它返回的是List&lt;ListView&gt; 而不是List&lt;ValidationModel&gt;?如果不知道更多关于你在哪里得到validationDto 以及它是什么类型,就不可能说出为什么会这样。请问可以提供minimum reproducible example吗? 【参考方案1】:

也许将字符串比较改为忽略大小写,

i.GType.Equals(groupType, StringComparison.OrdinalIgnoreCase)

这在 LinqPad 中有效,

var list = new List<ValidationModel>

    new ValidationModel  ListViews = new List<View> new View  GType="health"   ,
    new ValidationModel  ListViews = new List<View> new View  GType="health"   ,
;
var groupType = "health";
list.Where(a => a.ListViews.Any(i => i.GType.Equals(groupType, StringComparison.OrdinalIgnoreCase))).Dump();

【讨论】:

但它也会返回其他记录,其中 gtype != health @mohan,使用@Quan VO 的建议,将Any 更改为All【参考方案2】:

我认为您误解了Any 函数。

确定序列的任何元素是否存在或满足 条件。

你应该改用All

判断一个序列的所有元素是否满足一个条件

returnResult = validationDto.Where(a => a.Views.All(i => i.GroupType == groupType)).ToList();

【讨论】:

感谢您的回复!但运气不好。它返回 0 个项目,其中我有 18 条记录 gtype="health" @mohan: 情况一样吗? groupType 的值是多少?【参考方案3】:

当你对一个复杂的条件感到困惑时,你可以将逻辑提取到它自己的方法中。这允许您单独测试方法以确保您的逻辑正确。

我对您的要求不是很清楚,但这似乎是正确的:

bool HasOnlyHealth(ValidationModel model)

    if (model.ListViews.Count != 1) return false;
    if (model.ListViews.Single().ToUpper() != "HEALTH") return false;
    return true;

然后将该方法作为您的委托传递给Where 子句。

returnResult = validationDto.Where(HasOnlyHealth).ToList();

【讨论】:

以上是关于在 C# 中的列表内过滤 - 根据 where 条件选择的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 MongoDB 中的列表计数过滤文档? [复制]

如何根据 MongoDB 中的列表计数过滤文档? [复制]

C#根据类属性过滤类列表字典

根据 Pandas 中的字符串列表过滤行

MS Access 2013 - 根据文本框中的值过滤列表框中的值

如何根据对象属性字符串过滤“ngFor”循环内的项目