Подтвердить что ты не робот

Вставить в список в алфавитном порядке С#

Может ли кто-нибудь научить меня, как вставить элемент в список в алфавитном порядке в С#?

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

Пример кода:

Public Class Person
{
     public string Name { get; set; }
     public string Age { get; set; }
}

Public Class Storage
{
    private List<Person> people;

    public Storage
    {
        people = new List<Person>();
    }


    public void addToList(person Person)
    {
        int insertIndex = movies.findindex(
            delegate(Movie movie) 
            {
              return //Stuck here, or Completely off Track.

            }
        people.insert(insertIndex, newPerson);
    }

}
4b9b3361

Ответ 1

Определите сопоставление сравнения IComparer<T> Интерфейс:

public class PersonComparer : IComparer<Person>
{
    public int Compare(Person x, Person y)
    {
        return x.Name.CompareTo(y.Name);
    }
}

И используйте SortedSet<T> Класс, затем:

        SortedSet<Person> list = new SortedSet<Person>(new PersonComparer());
        list.Add(new Person { Name = "aby", Age = "1" });
        list.Add(new Person { Name = "aab", Age = "2" });
        foreach (Person p in list)
            Console.WriteLine(p.Name);

Если вы ограничены usinf.NetFramework3.5, вы можете использовать SortedList<TKey, TValue> Класс, а затем:

SortedList<string, Person> list = 
          new SortedList<string, Person> (StringComparer.CurrentCulture);
Person person = new Person { Name = "aby", Age = "1" };
list.Add(person.Name, person);
person = new Person { Name = "aab", Age = "2" };
list.Add(person.Name, person);

foreach (Person p in list.Values)
    Console.WriteLine(p.Name);

Проще всего прочитайте раздел "Примечания" в artcile MSDN, сравнив этот класс и SortedDictionary<TKey, TValue> Класс

Ответ 2

Если вы абсолютно хотите использовать список, попробуйте следующее:

int loc;
for(loc = 0; loc < people.Count && people[loc].Name.CompareTo(personToInsert.Name) < 0; loc++);
people.Insert(loc, personToInsert);

Вы можете заменить people[loc].Name.CompareTo(personToInsert.Name) < 0 на любое условие, для которого вы тестируете, - и вы можете изменить знак, чтобы он уменьшался, а не поднимался. Например, people[loc].Age < personToInsert.Age, например, сортирует по возрасту.

Ответ 3

Посмотрите SortedSet<T> класс. Просто используйте его вместо List<T>.

Ответ 4

SortedList - это то, что вам нужно. Создайте объект StringComparer и передайте его конструктору сортированного списка. Элементы автоматически сортируются по мере добавления новых элементов.

StringComparer stringComp = StringComparer.CurrentCulture;
SortedList sl = new SortedList(stringComp);
sl.Add("B", "SECOND");
sl.Add("A", "FIRST");
sl.Add("C", "THIRD");

Ответ 5

Старый поток, но ответы в этой теме IMO игнорируют фактический вопрос OP. Вопрос прост - как вы вставляете в список в отсортированном порядке. Это не то же самое, что "просто используйте SortedSet/SortedList". Будут разные характеристики и последствия, основанные на использовании приведенного ниже варианта использования SortedList.

SortedSet и SortedList основаны на словарях и не позволят вам добавить два элемента с тем же ключом AFAIK.

Итак, как вы учитываете список, например, {a, b, c, c, d}?

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

var binarySearchIndex = list.BinarySearch(item, itemComparer);
//The value will be a negative integer if the list already 
//contains an item equal to the one searched for above
if (binarySearchIndex < 0)
{
    list.Insert(~binarySearchIndex, item);
}
else
{
    list.Insert(binarySearchIndex, item);
}

Ответ через эту замечательную статью с 2010 года: https://debugmode.net/2010/09/18/inserting-element-in-sorted-generic-list-list-using-binary-search/