我收集了一些场景(Enterprise Architect场景)。每个场景都有一个类型,我想通过从特定场景开始循环遍历集合。
我想要开始循环的场景具有"基本路径"它包含一些关于其他场景的信息(我认为这是企业架构师中的一个错误,但它与这个问题无关。我只是想指出为什么我要从这个场景开始)。
Collection scenarios = element.Scenarios;
//Sort the collection?
foreach (Scenario sc in scenarios)
{
//Start with the scenario that has "Basic Path" type
}
该集合只能有一个具有该类型的场景。如何从该场景开始获取foreach语句?
编辑: 其余情景的顺序无关紧要。
答案 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
}