Est-ce juste moi, ou la réponse choisie est-elle brisée? Il passe 99% du temps à calculer la longueur d'entrée, et ne devrait pas inclure «identique» dans les appels suivants. Il ne finit jamais!
Je me rends compte qu'il est peu orthodoxe de convertir à la liste <> de IEnumerable <> mais cela fonctionne si cela ne vous dérange pas la copie. Peut-être qu'il y a un moyen de .FirstOrDefault() + .Skip (1) .FirstOrDefault() pour calculer si c'est 0 ou 1 de longueur sans faire le travail massif pour .Length()? Est-ce plus rapide que de mordre la balle et d'utiliser .Length()? peut-être pas ...
La comparaison de vitesse entre une requête correcte au lieu de .ForEach n'est pas concluante! Une plus grande entrée pourrait être nécessaire pour voir?
quickie:
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;
}
longueur d'entrée: 134217728
quickie: 00: 00: 08,2481166 quickie2: 00: 00: 05,0694132
quickie : 00: 00: 03.4997753 quickie2: 00: 00: 0 4.3986761
quickie: 00: 00: 06,9764478 quickie2: 00: 00: 04,8243235
quickie: 00: 00: 08,2962985 quickie2: 00: 00: 04,0703919
quickie: 00: 00: 04,2339839 quickie2: 00: 00: 08,5462999
quickie: 00: 00: 07,0605611 quickie2: 00: 00: 05,0110331
quickie: 00: 00: 03,1742108 quickie2: 00: 00: 06,9817196
quickie: 00: 00: 06,9593572 quickie2: 00: 00: 05,8098719
quickie: 00: 00: 03,4487516 quickie2: 00: 00: 04,1156969
quickie: 00: 00: 03.1562592 quickie2: 00: 00: 05.6059656
Ceci est la pire chose - pendant que je tapais la réponse Panos complété et posté sa réponse - exactement le même que le mien :-( –
Y a-t-il une différence autre que la syntaxe entre cette représentation explicite LINQ par opposition aux expressions Lambda dans Panos? version est plus efficace que l'autre? – Skeolan
Je vais accepter cette réponse, parce que c'est ce que je voulais, mais les autres réponses étaient vraiment cool! – Dana