我有一个嵌套的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.
}
}
}
提前致谢!
答案 0 :(得分:4)
使用查找(例如字典)来提高检查类型名称的速度:
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.
}
}
}
您还应该检查2个集合中的哪一个(StringList
或assemblyTypes
)可能更大。您通常希望将较大的一个转换为查找,以减少迭代次数。
答案 1 :(得分:2)
将Type []加载到Dictionary或HashSet中(取决于您的.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
}
}
答案 2 :(得分:0)
您可以尝试以下方式:
assemblyTypes.Where(x => StringList.Contains(x.Name));
请记住,这是区分大小写并忽略空格,因此如果这是一个问题,您需要添加案例考虑或修剪。
编辑:(循环使用示例)
foreach (Type item in assemblyTypes.Where(x => StringList.Contains(x.Name)))
{
// Do stuff
}
答案 3 :(得分:0)
如果您的数组/列表包含大量项目,则可以尝试使用Parallel ForEach loop。
答案 4 :(得分:0)
最佳优化可能是查询不是名称,而是查询实现的接口。
确保您正在优化代码的正确问题/部分。