2009-07-31 80 views

回答

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

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

如果你想要一個乾淨的區別選擇器比較器,你可以使用這個輔助類。這太糟糕了,你不能有一個「類擴展方法」給Array.Sort一組帶重載的選擇器。

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)); 
     } 
    } 
} 

在使用中:

從幾天前
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)); 
    } 
}