【问题标题】:Filter a list of type A, A containing a list of type B, with contition on an element of B in C#过滤类型 A 的列表,A 包含类型 B 的列表,条件是 C# 中 B 的元素
【发布时间】:2019-09-10 14:23:46
【问题描述】:

我有一个类型 A 的列表名称 lstA,其中类型 A 包含类型 B 的列表:

List<A> lstA;

Class A()
{
    List<B> lstB;
}

Class B()
{
    string str;
}

我想过滤列表 lstA,其中 B 类中的 str 具有某些特定值:

res = lstA.where(x => x.lstB.where(y => y.str == "some_value"));

目前我在 lstA 上使用 foreach 循环解决了这个问题:

foreach (var l in lstA)
{
     l.lstB.RemoveAll(x => x.str != "some_value");
}
res = lstA;

但我认为这不是最好的方法。有什么想法吗?

【问题讨论】:

  • “我认为这不是最好的方法” - 为什么不呢?看起来很丑吗?它工作不正确吗?表现不佳吗?
  • 没有res = lstA.where(x =&gt; x.lstB.where(y =&gt; y.str == "some_value")); 然后lstA.lstB = res 不起作用?假设您想修改原始列表。
  • hmmm 不清楚你是否想从 lstA 中获取所有 A,其中 lstB 包含 b 其中 b str == 某个值,或者如果你想从 lstB 中删除 != 值(你使用第二个代码)跨度>
  • @Selvin 我想要 lstA 中的所有 A,但只有 str 具有值的 B。
  • @CodeCaster 没有那么优雅。我将修改我的 lstA。

标签: c# where-clause generic-list


【解决方案1】:

您首先需要公开您的变量,以便它们可以在类本身之外访问,但这样应该可以:

var res = lstA.Where(x => x.lstB.Exists(y => y.str == "some_value"));

之前不工作的原因是因为

lstB.Where(y => y.str == "some_value")

当它没有找到你的值时返回一个空字符串。这与返回 false 不同,因此您实际上并未过滤数据。 Exists 方法返回一个布尔值,因此您可以使用它进行适当的过滤。

【讨论】:

  • 感谢您的回答,但它正在返回 str 的所有值,而不仅仅是“some_value”
  • 您的请求是过滤 lstA,其中 B 类中的 str 具有某些特定值。上面的代码在 lstB 中找到 str 存在的所有 lsaA。您是否尝试仅返回“some_value”的实例?
  • 我只想要一个特定的 str 值。例如仅当 str == "Ready" 时。
  • @dieKoderin 上面提供的代码只是过滤到 lstA ,其中 lstB 包含该值。如果您希望进一步过滤 lstB,那么建议您在 for 循环中过滤列表,就像您已经完成的那样。
【解决方案2】:

我不确定您要什么,但我们可以简化以下代码

foreach (var l in lstA)
{
     l.lstB.RemoveAll(x => x.str != "some_value");
}
res = lstA;

lstA.ForEach(a => a.lstB.RemoveAll(x => x.str != "some_value"));

【讨论】:

  • 我想把它用作一个函数,我会在不操纵我的 lstA 的情况下多次使用它
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2017-04-19
  • 2017-12-28
  • 2020-08-07
  • 2023-03-29
  • 1970-01-01
  • 2014-11-01
相关资源
最近更新 更多