2010-06-28 4 views
3

J'ai une liste de listes de chaînes contenant des valeurs DateTime converties en chaînes. Il y a d'autres valeurs dans la liste, donc je ne peux pas faire de la liste une liste complète DateTime.Liste des listes Trier par dates de chaîne?

J'ai une ligne de code qui trie la liste, mais trie les dates par leur valeur de chaîne, pas la valeur DateTime (ce que je veux). Comment puis-je modifier mon code pour trier correctement par le DateTime?

//This sorts the parent list by the 2nd column of the child list 
List.Sort((a, b) => -1 * a[1].CompareTo(b[1])); 

modifier:

Liste des échantillons Contenu:
Valeur1, 2010-06-28 10: 30: 00.000
Valeur2, 2010-06-27 10: 30: 00.000
Value2, 2010 10 -06 à 26: 30: 00.000

+0

peut vous envoyer un contenu de votre liste? –

+0

J'ai ajouté quelques exemples de contenu de la liste à l'article original – sooprise

+0

Votre liste contient-elle une chaîne de caractères? Vous y accédez comme si c'était un tableau de chaînes. –

Répondre

6

Essayez le folloting

List.Sort((a,b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1]))); 

Ou si vous avez l INQ pratique et n'a pas besoin d'un tri inplace

var sorted = myList.OrderBy(x => DateTime.Parse(x[1])); 
+1

DateTime.Parse renvoie l'erreur suivante: La chaîne n'a pas été reconnue en tant que DateTime valide. Dois-je reconvertir le DateTime en une chaîne? – sooprise

+0

@Soo alors les chaînes de votre collection ne sont pas réellement des dates comme votre question l'indique (ou elles sont dans un format non reconnu). Comment ces chaînes ont-elles pénétré dans cette structure de données? Pouvez-vous nous montrer du code? – JaredPar

+0

Le format de données provient d'une requête LINQ qui récupère les résultats d'une base de données SQL. Est-ce que C# ne devrait pas être capable de reconnaître le format de la date de toute façon? Je suis confus ... – sooprise

0

Vous devez d'abord analyser la chaîne dans un DateTime. En supposant que les secondes colonnes est toujours une chaîne de date/heure bien formée. Le code ci-dessous utilise LINQ pour créer une liste triée séparée:

sortedList = yourList.OrderBy(item => DateTime.Parse(item[1])).ToList(); 

Si vous devez trier en place, vous pouvez le faire en utilisant:

List.Sort((a,b)=>return DateTime.Parse(b[1]).CompareTo(DateTime.Parse(a[1])); 

Selon la façon dont les dates sont repsented, vous pouvez vouloir envisager d'utiliser DateTime.ParseExact().

+0

Vu la façon dont mes dates sont formatées: aaaa-mm-jj hh: mm: SS.mmm Comment puis-je utiliser ParseExact() pour faire ce travail correctement? – sooprise

0

Vous devez convertir une date [1] avant de la comparer.

List.Sort((a, b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1]))) 

EDIT:

Si votre requête LINQ qui remplit la liste remplit comme une liste de chaînes, alors vous devez obtenir une sous-chaîne de l'élément qui représente la partie date de la chaîne. DateTime.Parse ne sélectionnera pas simplement par magie la partie de la chaîne qui contient une valeur de date.

Si tel est le cas et que vous envisagez d'utiliser string.Split, assurez-vous de connaître le format de votre date, car certains formats permettent des virgules.

+0

Laissez-moi voir si je comprends bien. a [1] et b [1] représentent la deuxième valeur de chaque liste d'enfants, qui devrait être des éléments DateTime eux-mêmes. Should DateTime.Parse ne devrait pas fonctionner dans ce cas (ce n'est pas le cas). Je ne suis pas sûr pourquoi DateTime.Parse ne fonctionne pas parce que (d'après ma compréhension) a [1] et b [1] sont déjà des chaînes de date. – sooprise

2

Vous devez créer votre propre comparateur personnalisé.

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<string> list = new List<string> 
           { 
            "Value1, 2010-06-28 10:30:00.000", 
            "Value2, 2010-06-27 10:30:00.000", 
            "Value3, 2010-06-26 10:30:00.000" 
           }; 

     list.Sort(new MyComparer()); 
    } 
} 

internal class MyComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     var xItems = x.Split(new []{','}); 
     var yItems = y.Split(new []{','}); 
     var xDateTime = DateTime.Parse(xItems[1]); 
     var yDateTime = DateTime.Parse(yItems[1]); 
     return xDateTime.CompareTo(yDateTime); 
    } 
} 
0

Peut-être quelque chose comme

List<string> list = new List<string> 
{ 
"Value1, 2010-06-28 10:30:00.000", 
"Value2, 2010-06-27 10:30:00.000", 
"Value3, 2010-06-26 10:30:00.000" 
}; 

list.Sort((a, b) => 
    { 
     string[] aSplit = a.Split(','); 
     string[] bSplit = b.Split(','); 

     if (aSplit.Count() < 2 && bSplit.Count() < 2) 
      return a.CompareTo(b); 

     DateTime date1, date2; 

     if (!DateTime.TryParse(aSplit[1].Trim(), out date1) || 
      !DateTime.TryParse(bSplit[1].Trim(), out date2)) 
      return a.CompareTo(b); 

     return date2.CompareTo(date1); 
    }); 
Questions connexes