在 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<ListView>
而不是List<ValidationModel>
?如果不知道更多关于你在哪里得到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 条件选择的主要内容,如果未能解决你的问题,请参考以下文章