Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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#_Wpf_Foreach - Fatal编程技术网

C#嵌套foreach循环优化

C#嵌套foreach循环优化,c#,wpf,foreach,C#,Wpf,Foreach,我有一个嵌套的foreach循环,我真的需要减少计算时间。每个集合大约有50个成员,因此推断是巨大的。我已经看过很多关于SelectMany的信息,但我仍然不完全确定如何使用它,或者它是否是正确的解决方案 List<string> StringList; //Populated in previous code Type[] assemblyTypes = RandomAssembly.GetTypes(); foreach (String name in StringList)

我有一个嵌套的foreach循环,我真的需要减少计算时间。每个集合大约有50个成员,因此推断是巨大的。我已经看过很多关于SelectMany的信息,但我仍然不完全确定如何使用它,或者它是否是正确的解决方案

List<string> StringList; //Populated in previous code
Type[] assemblyTypes = RandomAssembly.GetTypes();

foreach (String name in StringList)
{                               
  foreach (Type at in assemblyTypes)
  {                             
    if (name == at.Name)
    {                                       
      //Do stuff.
    }
  }
}
List-StringList//在以前的代码中填充
类型[]assemblyTypes=RandomAssembly.GetTypes();
foreach(StringList中的字符串名称)
{                               
foreach(在assemblyTypes中键入at)
{                             
if(name==at.name)
{                                       
//做事。
}
}
}

提前谢谢

您可以尝试以下方法:

assemblyTypes.Where(x => StringList.Contains(x.Name));
请记住,这是区分大小写的,并且会忽略空格,因此如果这是一个问题,您需要添加大小写考虑或修剪

编辑:(循环使用示例)


将类型[]加载到字典或哈希集中(取决于您的.NET版本),然后内部循环消失

List<string> StringList; //Populated in previous code
Type[] assemblyTypes = RandomAssembly.GetTypes();
Dictionary<String,Type> typesHash = new Dictionary<String,Type>();
foreach ( Type type in assemblyTypes ) {
  typesHash.Add( type.Name, type );
}

foreach (String name in StringList) {                               
  Type type = null;
  if ( typesHash.TryGetValue( name, out type ) ) {
    // do something with type
  }
}
List-StringList//在以前的代码中填充
类型[]assemblyTypes=RandomAssembly.GetTypes();
字典类型SHASH=新字典();
foreach(assemblyTypes中的类型){
typesHash.Add(type.Name,type);
}
foreach(StringList中的字符串名称){
Type=null;
if(类型shash.TryGetValue(名称,输出类型)){
//用字体做某事
}
}
使用查找(如字典)来提高检查类型名称的速度:

List<string> StringList; //Populated in previous code
Dictionary<string,Type> assemblyTypes = RandomAssembly.GetTypes()
    .ToDictionary(t => t.Name, t => t);

foreach (String name in StringList)
{                               
    if (assemblyTypes.ContainsKey(name))
    {                                       
      //Do stuff.
    }
  }
}
List-StringList//在以前的代码中填充
Dictionary assemblyTypes=RandomAssembly.GetTypes()
.ToDictionary(t=>t.Name,t=>t);
foreach(StringList中的字符串名称)
{                               
if(assemblyTypes.ContainsKey(名称))
{                                       
//做事。
}
}
}

您还应该检查两个集合(
StringList
assemblyTypes
)中的哪一个可能更大。您通常希望将较大的一个转换为查找,以减少迭代次数。

如果您的数组/列表包含大量项,您可以尝试使用。

最好的优化可能不是查询名称,而是查询已实现的接口


确保您正在优化代码的正确问题/部分。

这仍然会导致代码对程序集中的每种类型迭代
StringList
一次-字典将非常有用quicker@SteveGreatrex:我没有选择类型(OP select List),但即使在使用字典时,也必须使用x.Keys.Contains(这与我的示例的作用相同)或者通过直接按键值访问字典项来为谓词提供更多代码。我不确定这样做是否值得,但我对OP涉及这两个方面的基准感兴趣。如果您使用
字典
,您可以使用
ContainsKey
方法,该方法在封面下使用哈希查找键。特别是对于la更大的集合,
ContainsKey
将比遍历
collection@Steve:当您第一次提到
列表时
我以为您的目的是更改该对象,而不是使用字典来控制类型。这种访问方法可以更快地检查密钥在这个级别上。内部循环没有消失,它只是嵌入到哈希的TryGetValue方法中。不过,在循环的这一部分中的搜索已使用哈希进行了缩减。另一方面,您可能希望将其调整为使用t.FullName,因为在单独的名称空间中具有公共控件的库可能会导致字典键发生冲突。My a假设OP需要在StringList变量中说明这一点。@JoelEtherton的观点很好,但他指出字符串列表来自其他地方(在他的示例中使用了
.Name
)我将按原样离开岗位now@SteveGreatrex这个方法似乎是正确的,但它仍然有点累人。StringList有多达40个成员,并且它需要成为父循环,因为“do stuff”是如何实现的节需要排序。减少StringList的大小可以大幅减少计算时间,但这不是真实情况。想法?如果我们在
StringList
中只讨论40个成员,那么我会感到惊讶,如果是对该列表的迭代导致了问题。两个问题:
StringList
assemblyTypes
集合中;那么“do stuff”在做什么?鉴于它稍微改变了问题,最好将该信息放在另一个问题中并发布链接here@SteveGreatrex
StringList
中的所有项目都位于
assemblyTypes
中,并且仅
assemblyTypes
中其中还有一些类定义。
List<string> StringList; //Populated in previous code
Dictionary<string,Type> assemblyTypes = RandomAssembly.GetTypes()
    .ToDictionary(t => t.Name, t => t);

foreach (String name in StringList)
{                               
    if (assemblyTypes.ContainsKey(name))
    {                                       
      //Do stuff.
    }
  }
}