C # Оптимизация вложенного цикла foreach - PullRequest
4 голосов
/ 11 октября 2011

У меня есть вложенный цикл 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.
    }
  }
}

Заранее спасибо!

Ответы [ 5 ]

4 голосов
/ 11 октября 2011

Используйте поиск (например, словарь), чтобы увеличить скорость проверки имени типа:

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)скорее всего будет больше.Обычно вы хотите, чтобы больший из них был преобразован в поиск, чтобы уменьшить количество итераций.

2 голосов
/ 11 октября 2011

Загрузите Type [] в Dictionary или HashSet (в зависимости от вашей версии .NET), и затем внутренний цикл исчезнет.

0 голосов
/ 11 октября 2011

Лучшей оптимизацией может быть запрос не для имени, а для внедренного интерфейса.

Убедитесь, что вы оптимизируете правильную проблему / часть вашего кода.

0 голосов
/ 11 октября 2011

Если ваш массив / список содержит много элементов, вы можете попробовать использовать Параллельный цикл ForEach .

0 голосов
/ 11 октября 2011

Вы можете попробовать что-то вроде:

assemblyTypes.Where(x => StringList.Contains(x.Name));

Имейте в виду, что это с учетом регистра и игнорирует пробелы, поэтому вам нужно будет добавить рассмотрение случая или обрезку, если это проблема.

Редактировать: (пример использования цикла)

foreach (Type item in assemblyTypes.Where(x => StringList.Contains(x.Name)))
{
    // Do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...