【问题标题】:filter inside list in C# -Select based on where condition在 C# 中的列表内过滤 - 根据 where 条件选择
【发布时间】: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吗?

标签: c# asp.net linq asp.net-web-api


【解决方案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();

【讨论】:

    猜你喜欢
    • 2021-09-02
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2014-12-15
    相关资源
    最近更新 更多