Какую коллекцию C # я должен использовать для изменяемого и повторяемого управления задачами? - PullRequest
2 голосов
/ 01 марта 2010

Я нахожусь в ситуации, когда я не уверен, какая коллекция лучше всего подойдет для моих нужд.

У меня есть ряд объектов задач, которые будут использоваться следующим образом ...

  1. Задачи будут выполняться повторно во время выполнения приложения.
  2. Задачи будут выполняться в определенном порядке в зависимости от приоритета, который я назначаю каждой из них. (Мне все равно, в каком порядке выполняются задачи с соответствующими приоритетами.)
  3. Ни одна задача не будет выполняться дважды за одну итерацию последовательности, поэтому повторяющихся записей нет.
  4. Между итерациями задачи могут добавляться или удаляться из любой точки последовательности в зависимости от их приоритета.

Если бы я делал это на Java, я бы искал какой-то SortedSet, но наборы в C # кажутся гораздо менее простыми. Кто-нибудь может дать какой-нибудь совет?

Спасибо!

РЕДАКТИРОВАТЬ: Спасибо всем, кто предложил различные коллекции списков, но списки позволяют дубликаты. (

Ответы [ 6 ]

2 голосов
/ 01 марта 2010

Если вы используете .NET 4.0, вы можете использовать SortedSet . Даже если вы не используете .NET 4.0, стоит помнить об этом, если / когда вы обновитесь.

1 голос
/ 02 марта 2010

К сожалению, .NET Framework в настоящее время не имеет концепции класса Set. Этот класс (и SortedSet в этом отношении) фактически должен быть добавлен в Framework в .NET 4.0.

Если вы не можете дождаться этого выпуска или не хотите нацеливаться на эту версию платформы, самое близкое, что вы получите, это SortedList или SortedDictionary, ни один из которых не допускает дублирования записей, и оба из которых предлагают сортированное поведение, которое вы можете найти полезным. Однако в обоих случаях ожидается, что вы предоставите ключ для своих объектов, что может не соответствовать желаемому поведению.

1 голос
/ 01 марта 2010

Вы можете поддерживать список задач любого типа, который реализует IEnumerable<T>, тогда как List<T> всегда является хорошим выбором для внутренней реализации.

Предполагая, что tasks является экземпляром IEnumerable<Task>, каждый раз, когда вам нужно выполнить задачи, вы можете упорядочить их методом OrderBy:

foreach(var task in tasks.OrderBy(t => t.Priority))
{
    task.Execute();
}

Кроме того, вы можете использовать синтаксис LINQ:

var orderedTasks = from t in tasks
                   orderby t.Priority
                   select t;
foreach(var task in orderedTasks)
{
    task.Execute();
}
1 голос
/ 01 марта 2010

Вы можете просто сохранить базовый список в List<Task>, и для каждого запуска использовать SortedList:

var taskRun = new SortedList<int, Task>();
foreach(task in tasks)
   runTasks.Add(task.Priority, task);
1 голос
/ 01 марта 2010

Почему бы не SortedList? Однако вам нужно будет предоставить ключ.

0 голосов
/ 01 марта 2010

Использование Список <> Класс

            List<Task> taskList = new List<Task>();
            Task task1 = new Task();
            taskList.Add(task1);
            taskList.Remove(task1);
...