2012-11-20 6 views
3

У меня проблемы с array.sort. У меня есть класс, и у этого класса есть два поля: одно - случайная строка, другая - случайное число. Если я хочу сортировать его с одним параметром, он просто отлично работает. Но я хотел бы отсортировать его с двумя параметрами. Первый - это СУММ чисел (от низкого до высокого), а ТО, если эти числа равны случайной строке, которая им дается (от низкого до высокого).Сортировка массива по двум параметрам

Можете ли вы дать некоторый намек и советы, как я могу «объединить» эти два вида рода?

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

google 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 чеков.

Смежные вопросы