2014-09-09 1 views
1

У меня есть список в классе, который я имею в собственности:Сортировка списка <T> недвижимости каждый раз, когда элемент добавляется

public List<string> MyList { get; set; } 

данные будут добавлены в этот список, и в конце концов, данные будут считаны. Когда данные считываются, то он будет читаться как:

foreach(string str in my_obj.MyList) 
{ 
    // do something 
} 

Я мог бы, конечно, сделать:

foreach(string str in my_obj.MyList.Sort()) 
{ 
    // do something 
} 

, но так как это библиотека классов я не хочу использовать, чтобы иметь в Делать что-нибудь. Я также не хочу, чтобы пользователь вызывал метод Sort() внутри класса. В идеале я бы хотел, чтобы список сортировался каждый раз, когда элемент был добавлен или когда он читается.

+0

Вы можете просто подкласс '' List и переопределить 'Add' и сортировки после добавления пункта - там также может быть' 'SortedList реализация – Charleh

+0

http://msdn.microsoft.com/en-us/library /ms132319(v=vs.110).aspx - вам нужно указать строки как ключ/значение – Charleh

+0

@Charleh: Это будет 'SortedList '. –

ответ

0

Вы можете изменить свойство, как это, используйте поле подкладочного и отсортировать его в геттерного метода, прежде чем вернуть список к абоненту:

private List<string> _myList; 
public List<string> MyList 
{ 
    get { _myList.Sort(); return _myList; } 
    set { _myList = value; } 
} 

Ofcourse это будет выполнять сортировку при попытке добавьте новый элемент в свой список, например myobj.MyList.Add("foo");, чтобы избежать этого, вы можете добавить другой метод, например AddToMyList и используйте вместо этого _myList.Add.И также измените тип свойства IEnumerable<string>, чтобы пользователь не мог добавлять новые элементы напрямую.

+0

У этого решения слишком много недостатков. Он будет сортировать каждый раз, когда список будет доступен, что является отходами, и оно не будет правильно отсортировано, когда элементы будут добавлены после того, как кто-нибудь получит ссылку на список. Поскольку любой, кто получает список, может добавлять к нему элементы, поэтому заказ может быть легко поврежден. – AVee

0

Ручка добавляет метод добавления в свой класс. Не защищает от прямого доступа к списку, но вы можете вставить элемент в правильный индекс своего списка, исходя из ваших требований к сортировке.

Этот подход позволяет вам прибегнуть к вашему списку в виде единственного попадания.

Просто еще одна идея рассмотреть.

0

Предполагая, что нет дубликатов в вас список, вы должны использовать SortedSet Это набор, поэтому он не может содержать один и тот же объект дважды (но как бы вы сортировали объекты, которые являются одинаковыми?), но в остальном он делает именно то, что вам нужно.

Вы также можете рассмотреть возможность реализации IEnumerable в классе, который содержит список, который позволит вам сделать простой do foreach(string str in my_obj). Затем вы можете сделать список приватным и отсортировать его один раз после того, как все объекты будут добавлены. Прямо сейчас каждый пользователь, который получает список, может также изменить его, удалить элементы и т. Д. Возможно, это не то, что вы хотите.

Реализация может быть столь же простым, как это:

public class MyClass : IEnumerable<string> 
{ 
    private List<string> myList = new List<string>(); 

    public MyClass() 
    { 
     // Fill myList... 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return myList.GetEnumerator(); 
    } 

    public IEnumerator<string> GetEnumerator() 
    { 
     return myList.GetEnumerator(); 
    } 
} 
0

Вы можете использовать System.Linq пространство имен, после добавления using System.Linq то вы должны быть в состоянии сделать следующее

List<string> list = new List<string>(); 
list = list.OrderByDescending(i => i).ToList(); 

или если вы хочу сортировать по возрастанию

list = list.OrderBy(i => i).ToList(); 

Если вы вызываете эти методы после добавления .Ваш список будет отсортирован.

+0

Или еще лучше, просто используйте [Список .Sort() вместо OrderBy()] (http://stackoverflow.com/questions/3056118/utility-of-listt-sort-versus-listt-orderby-for-a -member-of-a-custom-cont) – Default

0

Почему бы не пойти с SortedList ?? Я предполагаю, что именно то, что вы ищете. Вы можете просто игнорировать значение «short» в SortedList или просто указать значение по умолчанию. Или, может быть, вы можете найти некоторые средства для использования поля.

+0

Как вы сказали, его нужно сортировать по каждой вставке, код должен быть следующим: private List _myList; public List MyList { get {return _myList; } set {_myList = значение; _myList = _myList.Sort(); } } – Prashant19sep

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