Сортировка списка по одному его элементу и по пользовательскому условию - PullRequest
2 голосов
/ 11 марта 2012

У меня есть список, который содержит строку и другой список в ней - пример кода следующим образом:

List<Config> ConfigLists; 

Здесь Config - это класс, содержащий2 члена:

  • Имя строки
  • Список двоичных списков

, где Двоичный - другой класс.

Я хочу отсортировать список 'ConfigLists' на основе 'Name', содержащегося в каждом элементе списка.

Может кто-нибудь, пожалуйста, руководство?

Также я хотел бы использовать подстроку «Имя» для сортировки, поскольку «Имя» будет содержать значения, такие как «Неделя 07», «Неделя 09» и т. Д., Где подстрока, которую я возьму для сопоставления, является числовойчасть строки (например, «07», «09» и т. д.)

Ответы [ 3 ]

4 голосов
/ 11 марта 2012

Linq должен помочь здесь;

// using System.Linq;
ConfigLists = ConfigLists.OrderBy(x => x.Name).ToList();

... который, конечно, может быть использован для сортировки по подстроке ...

// Skips "Week ";
// using System.Linq;
ConfigLists = ConfigLists.OrderBy(x => x.Name.Substring(5)).ToList();

Если у вас более сложная сортировкаДля того, чтобы упорядочить или захотеть избежать временных строк в вашей сортировке, вы можете вместо этого использовать IComparer, чтобы выполнить сортировку для вас;

class WeekComparer : IComparer<Config>
{
    public int Compare(Config x, Config y)
    { 
        return string.Compare(x.Name, 5, y.Name, 5, int.MaxValue); 
    }
}

// using System.Linq;
var weekComparer = new WeekComparer();
ConfigLists = ConfigLists.OrderBy(x => x, weekComparer).ToList();

IComparer также работает с "простой старой" сортировкой, если вы этого не сделаетекак синтаксис Линка.

var weekComparer = new WeekComparer();
ConfigLists.Sort(weekComparer);
3 голосов
/ 11 марта 2012

Просто передайте делегат функции-члену Sort () следующим образом:

List<Config> ConfigLists; 
//...
ConfigLists.Sort((c1,c2) => 
    int.Parse(c1.Name.Substring(5)) - int.Parse(c2.Name.Substring(5)));
2 голосов
/ 11 марта 2012

Если вы реализуете интерфейс IComparable , вы можете точно решить, как будут сортироваться ваши пользовательские объекты.

возвращение положительного значения int (например, 1) будет складываться вперед и возвращать отрицательное значение intнапример, -1) будет отставать.

РЕДАКТИРОВАТЬ:

Код может выглядеть следующим образом:

public class Config : IComparable
{
   public string Name { get; set; }

   // other properties

   public int CompareTo(object obj) {
        if (obj == null) return 1;

        Config otherConfig = obj as Config;
        if (otherConfig != null) 

            // this is where you would place the compare logic

        else
           throw new ArgumentException("Object is not a Config");
    }
}

С таким решением выпридется вызвать list.Sort () в какой-то момент.Если вы стремитесь к эффективности, вы, возможно, захотите сохранить коллекцию в порядке на ходу (увеличив время сортировки). Этот пост объясняет варианты сделать это.

...