Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何减少多个嵌套的foreach块_C#_.net_Linq_Foreach - Fatal编程技术网

C# 如何减少多个嵌套的foreach块

C# 如何减少多个嵌套的foreach块,c#,.net,linq,foreach,C#,.net,Linq,Foreach,我有以下情况: var Ids = object1.GetIds(); // returns IEnumerable<int> foreach (var id in Ids) { foreach (var relatedObject in object1.GetRelatedObjects(id)) { // Do Something with related object } } var-Ids=object1.GetIds();//返回IEnum

我有以下情况:

var Ids = object1.GetIds(); // returns IEnumerable<int>
foreach (var id in Ids)
{
    foreach (var relatedObject in object1.GetRelatedObjects(id))
    {
    // Do Something with related object
    }
}
var-Ids=object1.GetIds();//返回IEnumerable
foreach(id中的变量id)
{
foreach(object1.GetRelatedObjects(id)中的var relatedObject)
{
//用相关对象做某事
}
}
在这种情况下,我想去掉第一个foreach,并将此逻辑简化为单个foreach。我怎样才能做到这一点


LINQ表达式是否可以使用类似的方法?

当两个循环之间没有任何内容时,在嵌套循环之前或之后,可以使用
SelectMany
将两个循环“展平”为一个:

foreach (var relatedObject in Ids.SelectMany(object1.GetRelatedObjects)) {
    ...
}
此循环与现有循环之间的一个主要区别是
id
不再在范围内。假设
relatedObject
公开了一个公共
Id
属性,在您的情况下这应该不是问题,因为您可以使用

var id = relatedObject.Id;

就个人而言,我喜欢充分利用
foreach
循环的可选大括号/块

你不能降低复杂性。但是你可以让它看起来更好

IEnumerable<int> Ids = object1.GetIds()

foreach (var id in Ids)
foreach (var relatedObject in object1.GetRelatedObjects(id))
{
     DoSomething(relatedObject);
}
IEnumerable Ids=object1.GetIds()
foreach(id中的变量id)
foreach(object1.GetRelatedObjects(id)中的var relatedObject)
{
剂量测量(相关对象);
}

如果您使用的是EF,那么应该有一些属性,比如
object1.RelatedObjects
正是我想要的。谢谢我认为这个语句也可以简化为以下内容:foreach(id.SelectMany(object.GetRelatedObjects)中的var relatedObject{…}@stackerflow您是对的,最好使用方法组语法重写。@Abion47当您希望两个循环的行为类似于扁平层次结构上的一个循环时,使用一个循环编写代码可以更接近您实际想要表达的内容,从而提高可读性。请将“与列表中ID相关的流程对象”与“与列表中ID相关的流程对象”进行比较。“从列表中获取ID,找到它们的相关对象,并对其进行处理。”取消中间步骤使逻辑更易于遵循;代码中也会发生同样的情况。例如,
var RelatedObjects=object1.GetIds().SelectMany(object1.GetRelatedObjects);foreach(var relatedObject in RelatedObjects){…}
根据我的经验,VisualStudio有时不喜欢使用同一行嵌套块,但当它决定使用它时,它看起来非常平滑。