Linq быстрее чем foreach и как заменить цикл на него? - PullRequest
0 голосов
/ 01 октября 2019

я хочу полностью удалить foreach.

вот мой код

foreach (var user in elite.Users)
{
    if (user.UserName==txtuser.Text && user.UserPWD==txtpass.Text)
    {                    
        MainForm mainForm = new MainForm();
        mainForm.ShowDialog();
        Hide();
        Close();
    }
}

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Под капотом Linq или Language Integrated Query - это (почти) то же самое, что выполнение foreach.

LINQ не быстрее и может быть медленнее, чем foreach. Он часто используется, потому что он может упростить и сократить код.

Если вы хотите улучшить производительность своей итерации, подумайте о добавлении break или continue операторы, где это возможно.

Вы также можете сделать итерацию быстрее, используя TLP ( Task Parallel Library ) или PLINQ ( Parallel LINQ ), которые используют несколько-threading.

Использование многопоточности в некоторых (и я бы даже сказал, в большинстве) ситуациях может быть медленнее, чем выполнение синхронизированной итерации. Это также приводит к тому, что ваш код становится гораздо более сложным и часто является источником многих ошибок в приложениях, если их не понимать.

0 голосов
/ 01 октября 2019

Linq не обязательно быстрее: это миф .

Linq использует много вызовов методов, которые занимают огромные циклы ЦП ...

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

Но в зависимости от типа объектов, с которыми вы работаете, Linq требует много ресурсов и иногда будетмедленнее.

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

Для вашего кода вам не нужен Linq, и он не будет работать быстрее.

Вы можете добавить разрыв в конце области if, чтобы он прекратил синтаксический анализ после обнаружения пользователя:

foreach (var user in elite.Users)
  if ( user.UserName == txtuser.Text && user.UserPWD == txtpass.Text )
  {                    
      MainForm mainForm = new MainForm();
      mainForm.ShowDialog();
      Hide();
      Close();
      break;
  }

Используя Linq, вы можете написать:

if ( elite.Users.Any(user => user.UserName == txtuser.Text 
                          && user.UserPWD == txtpass.Text) )
{
  MainForm mainForm = new MainForm();
  mainForm.ShowDialog();
  Hide();
  Close();
}

Как вы видите, у вас нет никакой выгоды с самим кодом, и он не будет выполняться быстрее или медленнее при такой простой вещи.

Потому что, что делает Linq? Это как-то делает foreach ...

https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,e73922753675387a,references

https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8087366974af11d2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...