lxf wrote: ↑28 Jan 2018 23:40
Falcon wrote: ↑28 Jan 2018 22:40
Большинство работы в современном программировании сводится к достаточно стандартным вещам.
Ну вот вам пример. Индус просит написать код на любоя языке (я выбрал C#), который сливает и сортирует 2 линкованных листа в один.
Я пишу код из 1 строчки. Индус недоволен, говорит, что надо на низкому уровне.
Code: Select all
var resultList = list1.Concat(list2).OrderBy(e => e).ToList();
Вопрос. Как часто на работе нам приходится изобретать колесо ? И нужны ли такие изобретатели ?
Ваше решение дает resultList как List, а не LinkedList. OrderBy применено к IEnumerable и кодировщик дот нета мог бы скопировать его в List, отсортировать и вернуть. Он бы откушал память, но было бы быстро. Вместо этого там нечто такое, что я бы никогда больше не вызывал OrderBy. Пройдитесь по шагам из VS по следующей программе и смотрите на память в Diagnostic Tools. Она зависнет в Func1 когда реально понадобится результат OrderBy. Func2 пройдет быстро.
А индус хотел in-place слияние-сортировку без копирования памяти вообще. Это интересный алгоритм, который Вы можете подсмотреть в C++ STL.
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Func2();
Func1();
}
static LinkedList<int> MakeMillionList()
{
var l = new LinkedList<int>();
for (int i = 0; i < 1000000; ++i)
l.AddLast(i);
return l;
}
static void Func1()
{
LinkedList<int> l1 = MakeMillionList();
LinkedList<int> l2 = MakeMillionList();
var s = l1.Concat(l2);
IOrderedEnumerable<int> s2 = s.OrderBy(v => v);
Console.WriteLine(s2.First());
var s3 = s2.ToList();
Console.WriteLine(s3.Count);
}
static void Func2()
{
LinkedList<int> l1 = MakeMillionList();
LinkedList<int> l2 = MakeMillionList();
var s = l1.Concat(l2);
List<int> s2 = s.ToList();
s2.Sort();
Console.WriteLine(s2.First());
var s3 = s2.ToList();
Console.WriteLine(s3.Count);
}
}
}