在 linq 查询的 foreach 循环中使用 foreach 循环

时间:2021-01-22 20:13:16

标签: c# linq

我想知道如何执行以下操作。我有 Linq 查询:

Items items.Where(i => i.GetType() == typeof(SubItem))
                .Cast<SubItem>()
                .ToList()
                .ForEach(i => i.SomeList.Add(i.SomeObject.ForEach(i => i.SomeString)));

我的问题是关于 i.SomeList.Add()。我想从 i.SomeList.Add()i.SomeObject 返回几个字符串值,但我不知道如何以这种方式执行此操作?是否有可能在 Linq ForEach 中使用另一个 ForEach 循环使用 Linq 查询?

2 个答案:

答案 0 :(得分:3)

如果我理解了这个问题,我相信这个 foreach 循环会实现您的目标。

它将遍历 items 中属于(或派生自)SubItem 的任何元素。然后它将选择所有 SomeObject.SomeString 字符串并将它们添加到 SomeList

foreach (var subItem in items.OfType<SubItem>()) {
    subItem.SomeList.AddRange(subItem.SomeObject.Select(o => o.SomeString));
}

这是 Panagiotis Kanavos、juharr 和 Aluan Haddad 建议的汇编。

答案 1 :(得分:1)

LINQ 并不是真正用于运行 Add 操作...当您将其视为返回结果集时,它的功能要强大得多。

所以代替

//Add every value of SomeField to targetList
sourceList.ForEach( x => targetList.Add(x.SomeField) )

考虑这样做:

//Create a list of all instances of SomeField and assign it to targetList
targetList = sourceList.Select( x => x.SomeField).ToList();

或者如果您需要在目标列表中保留现有项目,请执行以下操作:

//Create a list of all SomeFields and add it to targetList
targetList.AddRange
(
     sourceList.Select( x => x.SomeField )
);

同样,不要使用嵌套的 foreach,请考虑使用 SelectMany

我不完全清楚您的要求,但您可能想要这样的东西:

//To SomeList, add the SomeString field from all instances of SomeObject
someList.AddRange
(
    items.OfType<SubItem>().SelectMany( x => x.SomeObject ).Select( x => x.SomeString )
);