我想知道如何执行以下操作。我有 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 查询?
答案 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 )
);