2014-09-29 4 views
-1

У меня есть набор сценариев (сценарии Enterprise Architect). Каждый сценарий имеет тип, и я хочу прокрутить коллекцию, начав с определенного сценария.сортировка коллекции по конкретному типу C#

Сценарий, с которого я хочу начать цикл, имеет тип «Основной путь» и содержит некоторую информацию о других сценариях (что я считаю ошибкой в ​​архитектуре предприятия, но это не относится к этому вопросу. указать, почему я хочу начать с этого сценария).

Collection scenarios = element.Scenarios; 
//Sort the collection? 

foreach (Scenario sc in scenarios) 
{ 
    //Start with the scenario that has "Basic Path" type 
} 

В коллекции может быть только один сценарий с этим типом. Как я могу получить инструкцию foreach, чтобы начать с этого сценария?

EDIT: Порядок остальной части сценариев не имеет значения.

+0

Там, кажется, два вопроса, там - один о сортировке, и один о пропуске. Вы действительно хотите сортировать и пропускать? –

+0

Я не хочу пропустить какой-либо сценарий. Я просто хочу прокрутить коллекцию, начиная с этого сценария. –

+0

И thx к парню, который ниспадал без комментариев. Это определенно то, как люди учатся задавать лучшие вопросы. –

ответ

2

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

Collection scenarios = element.Scenarios 
           .Cast<Scenario>() 
           .OrderBy(c => c.type == "Basic Path" ? 0 : 1); 

foreach (Scenario sc in scenarios) 
{ 
    //Start with the scenario that has "Basic Path" type 
} 

Это сортирует элементы, присваивая их сортировки значения 0 если тип является «Базовый путь» или 1 иначе. Таким образом, они появятся в первую очередь.

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

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

var BasicPath = element.Scenarios 
         .Cast<Scenario>() 
         .SingleOrDefault(c => c.type == "Basic Path"); 

Вы также можете просто использовать FirstOrDefault, если несколько возвращается не является признаком повреждения данных.

Тогда вы могли бы повторить и другие.

foreach (var v in element.Scenarios.Cast<Scenario>().Where(c => c.type != "Basic Path")) 
{ 
    // definitely not the same as that first one. 
} 
+0

Это сборник корпоративных архитекторов. Я думаю, что это тип IDualCollection. –

+0

@ n.Stenvang Хорошо, хорошо, если я правильно понимаю вас, один из них должен делать то, что вы хотите. –

+0

Я попытался реализовать оба предложения, и они оба работают по назначению. Thx для ответа - Upvoted! Кажется, я мог бы использовать некоторые уроки по этой теме. –

0

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

0

Можете ли вы сделать свой тип классом, а не строкой, и дать ему свойство, представляющее последовательность, в которой вы хотите обрабатывать элементы. Таким образом, «Основной тип» может иметь последовательность 1. Затем вы можете заказать свой запрос в этой последовательности.

0

Вы можете сделать это, используя комбинацию SkipWhile() и TakeWhile(), где оба используют один и тот же предикат.

Вот пример со списком целого (для простоты):

IEnumerable<int> sequence = Enumerable.Range(0, 15); 

Func<int, bool> predicate = x => x != 10; 

var result = 
    sequence.SkipWhile(predicate) 
    .Concat(sequence.TakeWhile(predicate)); 

// This prints 
// 10, 11, 12, 13, 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 

Console.WriteLine(string.Join(", ", result)); 

Для примера, это может выглядеть примерно так:

Func<Scenario, bool> predicate = s => s.Type != "Basic Path"; 

var sequence = 
    scenarios.SkipWhile(predicate) 
    .Concat(scenarios.TakeWhile(predicate)); 
+0

Получение следующей ошибки: Аргумент экземпляра: невозможно преобразовать из 'EA.Collection' в 'System.Collections.Generic.IEnumerable ' –

0

Вы не можете перечислить IEnumerable коллекции, начиная с перед тем, как заказать его. Если вы не хотите сделать заказ коллекции, есть другой способ:

var bpScenario = element.Scenarios.First(o=> {your condition to get your "Basci Path"(what is it? Is this Type or field value or what?)}); 
// 
// here process your "Basic Path" scenario 
// 
foreach(var scenario in element.Scenarios.Where(o=> {condition where not "Basic Path" scenario})) 
{ 
// process your other scenarios 
} 
Смежные вопросы