Сортировать список, содержащий пользовательский тип при новом добавлении - PullRequest
2 голосов
/ 30 ноября 2011

Итак, у меня есть пользовательский тип Foo:

public class Foo
{
    public string Description {get;set;}
    public int Order {get;set;} //not unique - just some integer
    public DateTime Date {get;set;}
}

и список, содержащий это Foo с (посмотрите, что я там делал?):

public class FooTops : List<Foo>
{
    public string Description {get; set;}
    public DateTime Date {get; set}

    public void AddCustom(Foo foo)
    {
        if (this.Count == 0)
        {
            this.Description = foo.Description;
            this.Date = foo.Date;
        }
        else
        {
            if (foo.Order == 1)
            {
                this.Date = foo.Date;
            }
        }
        this.Add(foo);
    }
}

IТеперь я хочу преобразовать этот список в SortedList, но этот список не может принять мой пользовательский тип Foo.

Как мне отсортировать мой список по Foo.Order?По сути, я хочу, чтобы многие FooTops, содержащие Foo, отсортированные по их Foo.Order.

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


Решение:

Я только что составил список SortedList<int,Foo>.TKey это Foo.Order.Конечно, этот ключ не является уникальным, поэтому перед строкой `this.Add (foo); 'я просто генерирую уникальный ключ:

private in CheckForUniqueOrder(int p)
{
    if (this.ContainsKey(p))
    {
        p = p +1;
        p = CheckForUniqueOrder(p); //love recursion...
    }
    return p;
}

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Если вы хотите sort список при добавлении. Лучше всего было бы вставить элемент в позицию, которая бы сделала List по-прежнему упорядоченной (при этом методе сложность равна O (N), при любом методе сортировки он выше, поскольку многие алгоритмы сортировки действительно плохо работают с почти отсортированной коллекцией). Предполагается, что этот список упорядочен при добавлении нового элемента:

int index = 0;
foreach(var item in this)
{
    if(item.Order > newItem.Order)
    {
        this.Insert(index, newItem);
        break;
    }

    index++;
}
1 голос
/ 30 ноября 2011

Используйте SortedList и используйте Foo.Order в качестве ключа для списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...