按特定类型排序集合c#

时间:2014-09-29 07:35:48

标签: c# sorting collections

我收集了一些场景(Enterprise Architect场景)。每个场景都有一个类型,我想通过从特定场景开始循环遍历集合。

我想要开始循环的场景具有"基本路径"它包含一些关于其他场景的信息(我认为这是企业架构师中的一个错误,但它与这个问题无关。我只是想指出为什么我要从这个场景开始)。

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

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

该集合只能有一个具有该类型的场景。如何从该场景开始获取foreach语句?

编辑: 其余情景的顺序无关紧要。

5 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:0)

你不能。您需要根据您的规格重新排序。或者让element.Scenarios成为您特定的一些集合,并按照您希望的方式实现它。

答案 2 :(得分:0)

您可以将类型设为类而不是字符串,并为其指定一个属性,表示您要处理项目的顺序。所以&#39;基本类型&#39;可能有一个序列1.然后您可以按此顺序排序查询。

答案 3 :(得分: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));

答案 4 :(得分: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
}