Мудрая производительность Miroo, ваши петли for будут выигрывать руки каждый раз, когда бы вы ни представляли LinQ, или какой бы модный вам ни был представлен в настоящее время.
Как говорят принципалы бритвы Оккама, «самый простой ответ чаще всего правильный». Не каждый раз, но в этом случае я думаю, что это применимо.
Например, я создал простое приложение ниже с секундомером, чтобы измерить время, необходимое для каждой сортировки. Я добавил ваш подход для цикла и метод сортировки одной строкой, который я сделал.
Я провел несколько тестов, и ваш цикл намного быстрее, чем моя строка кода. Что бы вы ни делали, вы добавите больше тактов к часам, есть бесчисленные способы сортировки вашего массива, я мог бы даже уменьшить свой, но в конце ваш цикл был бы быстрее.
Если бы ваш вопрос был не о производительности, а об элегантности, сокращении количества линий или даже большей устойчивости, тогда мой ответ был бы другим.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
List<int> list1 = new List<int> { 341932,346447,354534,335743,351166,350016,352398,354390,351389,342070,335667,338576,335761,354504,352421,350090,342114,351396,354436,355624,352339,352378,355580};
List<int> list2 = new List<int> { 335667,335743,335761,338576,341932,342070,342114,346447,350016,350090,351166,351389,351396,352339,352378,352398,352421,354390,354436,354504,354534,355580,355624};
List<int> list3 = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < list1.Count; i++)
{
for (int j = 0; j < list2.Count; j++)
{
if (list1[i] == list2[j])
{
list3.Add(list2[j]);
break;
}
}
}
watch.Stop();
Console.WriteLine("Time {0}", watch.ElapsedMilliseconds);
list3.Clear();
watch.Reset();
watch.Start();
list2.Intersect(list1).OrderBy(o => list1.IndexOf(o)).All(a => { list3.Add(a); return true; });
watch.Stop();
Console.WriteLine("Time {0}", watch.ElapsedMilliseconds);
}
}
}