Tri d'une liste contenant un tableau

cybers7119 Messages postés 20 Date d'inscription lundi 16 juin 2008 Statut Membre Dernière intervention 19 janvier 2009 - 1 juil. 2008 à 13:39
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 1 juil. 2008 à 15:03
Salut,

Je travaille en ce moment sur une liste contenant un tableau de string ( List<string[]> ).
Or, je souhaiterais trier cette liste en fonction d'un des éléments contenus dans le tableau de string ( par exemple, string[2] ).
Lorsque j'appelle la fonction Sort(), sans lui donner de paramètres, elle me renvoie une erreur.

Quelqu'aurait une idée ?

7 réponses

cybers7119 Messages postés 20 Date d'inscription lundi 16 juin 2008 Statut Membre Dernière intervention 19 janvier 2009 2
1 juil. 2008 à 13:42
Ah oui, j'ai oublié de préciser : le tableau de string contient en fait des DateTime que j'ai transformés en string.
Je souhaite les trier du plus ancien au plus récent.
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
1 juil. 2008 à 14:02
Salut,

Peux-tu nous donner le code qui permet d'alimenter ton tableau, car on ne voit pas très bien la structure de celui-ci.

Merci,


Billou_13
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
1 juil. 2008 à 14:13
Bon, au cas où, je te propose un exemple:

1) Il te faut implémenter un classe dérivant de l'interface IComparer<> te permettant de donner la logique de ta comparaison:

Ex:
/// <summary>
/// Compareur de date au sein d'un string[]
/// </summary>
public class DateComparer : IComparer<string[]>
{
/// <summary>
/// Méthode permet de comparer
/// </summary>
/// Premier tableau de string


/// Second tableau de string


/// <returns>renvoie -1 si a[1] inférieur à b[1], 1 si supérieur, 0 si égal</returns>
public int Compare(string[] a, string[] b)
{
DateTime d1 = DateTime.Parse(a[1]);
DateTime d2 = DateTime.Parse(b[1]);

return d1.CompareTo(d2);
}
}

(A toi de gérer les exceptions, je te laisse faire ^^)

2) Ensuite, il te suffit de faire ton Sort.

Ex:
List<string[]> tab = new List<string[]>();

string[] s0 = new string[2];
s0[0] = "Demain";
s0[1] = DateTime.Now.AddDays(1.0).ToString();

string[] s1 = new string[2];
s1[0] = "Aujourd'hui";
s1[1] = DateTime.Now.ToString();

string[] s2 = new string[2];
s2[0] = "Hier";
s2[1] = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0)).ToString();

tab.Add(s0);
tab.Add(s1);
tab.Add(s2);

tab.Sort(new DateComparer());

Voila, j'espère que ce que tu cherches ressemble à cela ^^

Bonne après midi,


Billou_13
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
1 juil. 2008 à 14:17
Un p'tit conseil néanmoins, si tu souhaites gérer des dates dans une colonne, je te conseille de typé ton code.

Tu peux faire simplement une classe contenant "toutes les colonnes" (typées):
- string
- date
- int
- etc...

Et travailler avec un objet du type List<TaClasse>.

Ce sera plus pratique et plus facile à comprendre (et plus rapide dans l'exécution des traitements).
De plus, si tu souhaites ajouter une colonne, ce sera beaucoup plus simple

C'était une suggestion,


Billou_13
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cybers7119 Messages postés 20 Date d'inscription lundi 16 juin 2008 Statut Membre Dernière intervention 19 janvier 2009 2
1 juil. 2008 à 14:23
En fait, mon tableau de string contient les quatre colonnes suivantes :
1) une DateTime que j'ai transformé en string (sous cette forme "12/21/2008")
2), 3), 4) juste du texte
Il n'y aura pas de colonnes à ajouter.
0
cybers7119 Messages postés 20 Date d'inscription lundi 16 juin 2008 Statut Membre Dernière intervention 19 janvier 2009 2
1 juil. 2008 à 14:36
Génial, ta méthode sur DataComponer fonctionne !
Toutefois, connais-tu le moyen de faire ce filtre non pas sur un DateTime, mais sur un string contenant uniquement la date (sans l'heure), du genre "12/21/2008" ?
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
1 juil. 2008 à 15:03
A toi de faire disparaître les secondes, minutes et heures dans ton code ^^

Par exemple:

public int Compare(string[] a, string[] b)
{
DateTime d1 = DateTime.Parse(a[1]);
d1 = d1.Subtract(new TimeSpan(0, d1.Hour, d1.Minute, d1.Second, d1.Millisecond));
DateTime d2 = DateTime.Parse(b[1]);
d2 = d2.Subtract(new TimeSpan(0, d2.Hour, d2.Minute, d2.Second, d2.Millisecond));

return d1.CompareTo(d2);
}

Néanmoins, si tu parse un string de type "dd/MM/yyyy", tu n'auras pas les heures, minutes, secondes ... et cela fonctionnera.

Perso, c'est la seule méthode que je vois sur le coup,


Billou_13
0
Rejoignez-nous