2012-11-20 145 views
3

我對array.sort有點困難。我有一個班,這個班有兩個字段,一個是隨機字符串,另一個是隨機數字。如果我想用一個參數對它進行排序,它可以正常工作。但我想用兩個參數對它進行分類。第一個是數字的總和(從低到高),然後THEN如果這些數字是相同的隨機字符串給他們(從低到高)。由兩個參數排序的數組

你可以給我一些提示和提示我怎麼可以「合併」這兩種排序?

Array.Sort(Phonebook, delegate(PBook user1, PBook user2) 
     { return user1.Sum().CompareTo(user2.Sum()); }); 
     Console.WriteLine("ORDER"); 

     foreach (PBook user in Phonebook) 
     { 
      Console.WriteLine(user.name); 
     } 

這就是我如何用一個參數來命令它。

+3

您可以分享一些代碼示例,瞭解您正在執行的操作以及您嘗試執行的操作沒有奏效嗎? –

+1

總結什麼數字?每個項目只有一個數字,對嗎? – Rawling

+0

谷歌LINQ加入查詢和訂購 - 有一個提示 –

回答

8

我想這是你所追求的:

sourcearray.OrderBy(a=> a.sum).ThenBy(a => a.random) 
1

這裏是您將用於在CompareTo方法比較多個領域的一般算法:

public int compare(MyClass first, MyClass second) 
{ 
    int firstComparison = first.FirstValue.CompareTo(second.SecondValue); 

    if (firstComparison != 0) 
    { 
     return firstComparison; 
    } 
    else 
    { 
     return first.SecondValue.CompareTo(second.SecondValue); 
    } 
} 

然而,LINQ做使語法更容易,只允許你寫:

Phonebook = Phonebook.OrderBy(book=> book.Sum()) 
      .ThenBy(book => book.OtherProperty) 
      .ToArray(); 
1

你可以通過使用自定義IComparer<PBook>在原地進行此操作。下面應該命令你的陣列按你原來的代碼,但如果兩個之和相等,應該回到屬於隨機字符串(我已經叫RandomString):

public class PBookComparer : IComparer<PBook> 
{ 
    public int Compare(PBook x, PBook y) 
    { 
     // Sort null items to the top; you can drop this 
     // if you don't care about null items. 
     if (x == null) 
      return y == null ? 0 : -1; 
     else if (y == null) 
      return 1; 

     // Comparison of sums. 
     var sumCompare = x.Sum().CompareTo(y.Sum()); 
     if (sumCompare != 0) 
      return sumCompare; 

     // Sums are the same; return comparison of strings 
     return String.Compare(x.RandomString, y.RandomString); 
    } 
} 

你把這個作爲

Array.Sort(Phonebook, new PBookComparer()); 

可以只是這樣做內聯,但它變得有點難以遵循:

Array.Sort(Phonebook, (x, y) => { 
    int sc = x.Sum().CompareTo(y.Sum()); 
    return sc != 0 ? sc : string.Compare(x.RandomString, y.RandomString); }); 

...其實,這是不太差了,雖然我已經下了null檢查。