2014-09-29 80 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 
}