2009-07-31 4 views
0

Possible en double:
How to sort an array of FileInfo[] C#Trie un tableau d'objets fortement typés basés sur une propriété de l'objet

en double de How to sort an array of FileInfo[] C#

J'ai un tableau [] d'objets, pour certaines raisons je ne peux pas le changer en Liste <>, est-il possible de trier sur le tableau [] des objets, basé sur une valeur dans 1 champ de l'objet?

Par exemple

arrayOfFruit[] fruit; 

fruit.sort(name); 

grâce

+0

Dupliquer il y a quelques jours ... la recherche ... –

Répondre

0

Vous pouvez utiliser un IComparer comme paramètre de trier

0
void SomeMethod() 
{ 
    Fruit fruits[] = GetArrayOfFruit(); 
    Array.Sort(fruits, FruitNameComparer); 
} 

int FruitNameComparer(Fruit lhsOfQEquals, Fruit rhsOfEquals) 
{ 
    return String.Compare(lhsOfQEquals.Name, rhsOfEquals.Name); 
} 
1

Si vous voulez une distinction nette du sélecteur et du comparateur, vous pouvez utiliser cette classe d'assistance. C'est dommage que vous ne pouvez pas avoir une "méthode d'extension de classe" pour donner Array.Sort un ensemble de surcharges qui prennent un sélecteur.

public static class SelectingComparer<T> 
{ 
    public static IComparer<T> Create<U>(Func<T, U> selector) 
    { 
     return new SelectingComparerImpl<U>(selector, null); 
    } 

    public static IComparer<T> Create<U>(Func<T, U> selector, IComparer<U> comparer) 
    { 
     return new SelectingComparerImpl<U>(selector, comparer.Compare); 
    } 

    public static IComparer<T> Create<U>(Func<T, U> selector, Comparison<U> comparison) 
    { 
     return new SelectingComparerImpl<U>(selector, comparison); 
    } 

    private class SelectingComparerImpl<U> 
     : IComparer<T> 
    { 
     private Func<T, U> selector; 
     private Comparison<U> comparer; 

     public SelectingComparerImpl(Func<T, U> selector, Comparison<U> comparer) 
     { 
      if (selector == null) 
       throw new ArgumentNullException(); 

      this.selector = selector; 
      this.comparer = comparer ?? Comparer<U>.Default.Compare; 
     } 

     public int Compare(T x, T y) 
     { 
      return this.comparer(this.selector(x), this.selector(y)); 
     } 
    } 
} 

En utilisation:

public class Testing 
{ 
    public void Foo() 
    { 
     FileInfo[] files = new FileInfo[30]; 
     // FILL THE FILE ARRAY 
     Array.Sort(files, SelectingComparer<FileInfo>.Create(file => file.Name)); 
     Array.Sort(files, SelectingComparer<FileInfo>.Create(file => file.Name, StringComparer.OrdinalIgnoreCase)); 
    } 
} 
Questions connexes