Fais les deux.
Dans son cas, de toutes les façons, le array list et l'itération vont demander :
- Un Cast
- Un risque sur le fait que l'élément soit vraiment le dernier
Ce à quoi il faudrait vraiment utiliser une Queue<T> qui elle va garantir une pile fifo cohérente.
Quant au for while, chez moi, ça prend 3ms en linq ou avec un for qui utilise une indexation inverse (partir du dernier).
A partir du moment ou tu mets le dernier en position aléatoire, le linq devient plus performant (vu que l'itération est elle plus ou moins longue) car linéaire, donc prédictible.
Quoi qu'il en soit on peut rendre l'ordre aléatoire :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
class Program
{
public class A
{
public bool Prop1
{
get; set;
}
public string Prop2
{
get; set;
}
public static A[] GetThousands()
{
var x = new A[100000];
for (int i = 0; i < 100000; i++)
{
Random r=new Random();
x[i] = r.NextDouble() * 100<5? new A() { Prop1 = true, Prop2 = "Whatever" } :
new A() {Prop1 = false, Prop2 = "And ever"};
}
return x;
}
}
static void Main(string[] args)
{
var a1 = A.GetThousands();
List<A> al1=new List<A>(a1);
var d1 = DateTime.Now;
var o1 = al1.Last(x => x.Prop1);
var d2 = DateTime.Now;
Console.WriteLine(d2.Subtract(d1).Milliseconds);
Queue<A> aq1 = new Queue<A>(a1);
d1 = DateTime.Now;
var o2 = aq1.Last(x => x.Prop1);
d2 = DateTime.Now;
Console.WriteLine(d2.Subtract(d1).Milliseconds);
Console.Read();
}
} |
Et là je reste dans le 3ms.
Partager