Sadece ben miyim, yoksa seçilen cevap kırık mı? Giriş uzunluğunu hesaplayan zamanın% 99'unu harcar ve sonraki aramalarda 'aynı' içermemelidir. Asla bitmez!
List <> IEnumerable <> 'ye dönüştürmek için alışılmışın dışında olduğunun farkındayım, ancak kopyalama işlemini önemsemiyorsanız işe yarayacaktır. Belki .FirstOrDefault() + .Skip (1) .FirstOrDefault() için bir yol var .Length() için muazzam bir iş yapmadan 0 veya 1 uzunluğunda olup olmadığını hesaplamak için? Bu mermi ısırma ve .Length() kullanarak daha hızlı mı? Belki de ...
.ForEach yerine uygun bir sorgu arasındaki hız karşılaştırması sonuçsuz! Görmek için daha büyük bir giriş gerekli olabilir?
şipşak:
case 0: ites.ForEach(k => { if (k < piv) les.Add(k); }); break;
case 1: ites.ForEach(k => { if (k == piv) sam.Add(k); }); break;
case 2: ites.ForEach(k => { if (k > piv) mor.Add(k); }); break;
quickie2:
private static List<int> quickie2(List<int> ites)
{
if (ites.Count <= 1)
return ites;
var piv = ites[0];
List<int> les = new List<int>();
List<int> sam = new List<int>();
List<int> mor = new List<int>();
Enumerable.Range(0, 3).AsParallel().ForAll(i =>
{
switch (i)
{
case 0: les = (from _item in ites where _item < piv select _item).ToList(); break;
case 1: sam = (from _item in ites where _item == piv select _item).ToList(); break;
case 2: mor = (from _item in ites where _item > piv select _item).ToList(); break;
}
});
List<int> allofem = new List<int>();
var _les = new List<int>();
var _mor = new List<int>();
ConcurrentBag<ManualResetEvent> finishes = new ConcurrentBag<ManualResetEvent>();
for (int i = 0; i < 2; i++)
{
var fin = new ManualResetEvent(false);
finishes.Add(fin);
(new Thread(new ThreadStart(() =>
{
if (i == 0)
_les = quickie(les);
else if (i == 1)
_mor = quickie(mor);
fin.Set();
}))).Start();
}
finishes.ToList().ForEach(k => k.WaitOne());
allofem.AddRange(_les);
allofem.AddRange(sam);
allofem.AddRange(_mor);
return allofem;
}
giriş uzunluğu: 134.217.728
şipşak: 00: 00: 08,2481166 quickie2: 00: 00: 05,0694132
şipşak : 00: 00: 03.4997753 quickie2: 00: 00: 0 4.3986761
şipşak: 00: 00: 06,9764478 quickie2: 00: 00: 04,8243235
şipşak: 00: 00: 08,2962985 quickie2: 00: 00: 04,0703919
şipşak: 00: 00: 04,2339839 quickie2: 00: 00: 08,5462999
şipşak: 00: 00: 07,0605611 quickie2: 00: 00: 05,0110331
şipşak: 00: 00: 03.1742108 quickie2: 00: 00: 06,9817196
şipşak: 00: 00: 06,9593572 quickie2: 00: 00: 05,8098719
şipşak: 00: 00: 03,4487516 quickie2: 00: 00: 04,1156969
Daha fazla bilgi için: 00: 00: 03.1562592 quickie2: 00: 00: 05.6059656
Bu en kötüsü - Panos'u tamamladım ve cevabını yazarken - benimkiyle tam olarak aynı :-( –
Panos'taki Lambda ifadelerinin aksine bu açık LINQ temsili arasında sözdizimi dışında bir fark var mı? Versiyon: Ya diğerinden daha verimli mi? – Skeolan
Bu cevabı kabul edeceğim, çünkü temelde istediğim şey buydu.Ama diğer cevaplar gerçekten harika! – Dana