2014-09-29 76 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语句?编号: 其余场景的顺序无关紧要。

+0

有似乎有两个问题 - 一个有关排序,以及一个约跳过。你真的想排序和跳过? – 2014-09-29 07:39:25

+0

我不想跳过任何情况。我只是想循环从该场景开始的集合。 – 2014-09-29 07:52:49

+0

而thx给那些没有评论而低估的人。这绝对是人们学习提出更好问题的方式。 – 2014-09-29 08:00:17

回答

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。 – 2014-09-29 08:42:19

+0

@ n.Stenvang好吧,不管如果我正确地理解你,其中一个人应该做你想做的事。 – 2014-09-29 08:46:38

+0

我试图实现这两个建议,他们都按预期工作。 Thx回答 - Upvoted! 看来我可以在这个主题上使用一些教程。 – 2014-09-29 08:56:51

0

你不能。您需要根据您的规格重新排列它们。或者有元素。场景是你的特定集合的一部分,并以你想要的方式实现它。

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 ” – 2014-09-29 08:29:56

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 
}