2014-02-17 31 views
-3

我有一個List<string>,它看起來像下面的代碼。從兩個項目之間獲取項目

我需要收集{}之間的數據我不確定我應該如何繼續,因此任何信息將不勝感激。

send 1, 
wait 200, 
loop 5 {, 
send 2, 
wait 200, 
}, 
send 3, 
loop 2 {, 
send a, 
wait 50, 
} 
+0

列表作爲是什麼?一串字符串?一個ListBox?請更清楚。 –

+0

@ThorstenDittmar對不起,我寫了List (List String),但由於某種原因,它沒有在帖子中包含<>。 – Ezzy

+1

上面的每行是'List'中的一個單獨的'String'嗎?如果不是,它是如何在列表中分解的? –

回答

1

你可以這樣做:

int n = 0; 
while (n < list.Count) 
{ 
    List<string> everythingBetweenBraces = new List<string>(); 
    if (list[n].EndsWith("{"); 
    { 
     n++; 
     while (list[n] != "}"); 
     { 
      everythingBetweenBraces.Add(list[n]); 
      n++; 
     } 
     n++; // Don't forget to jump to the next line after } 
    } 

    ... 
} 

這將檢查當前行是否與{結束,如果是的話,一切都增加了一個新的列表,直到}是在一行中。

4

你可以這樣做:

var firstIndex = list.FindIndex(r=> r.Contains('{')); 
var secondIndex = list.FindIndex(r=> r.Contains('}')); 
var result = list.Skip(firstIndex + 1).Take(secondIndex - (firstIndex +1)); 

其結果將是:

enter image description here

問題的第一個版本不具有指定沒有多段,我想這是在加寬限期。上述版本的答案可以使用字符串的單個部分。爲了得到它與多段工作,一個循環可以使用,如:

List<string> matchedItems = new List<string>(); 
List<string> listToWorkOn = new List<string>(list); 
while(listToWorkOn.Any()) 
{ 
    var firstIndex = listToWorkOn.FindIndex(r => r.Contains('{')); 
    var secondIndex = listToWorkOn.FindIndex(r => r.Contains('}')); 
    matchedItems.AddRange(listToWorkOn.Skip(firstIndex + 1).Take(secondIndex - (firstIndex + 1))); 
    listToWorkOn = listToWorkOn.Skip(secondIndex + 1).ToList(); 
} 

matchedItems將導致從列表4項目。

+3

哦,LINQ的奇蹟......這比我的回答短得多......: - )但是它是否與原始問題中的多個部分一起工作? –

+0

@ThorstenDittmar,不,它沒有,我沒有看到問題中的多個部分,當它被張貼 – Habib

+1

非常「好」的問題很好的答案。 –

1

你可以試試這個:

var s = new List<string> 
     { 
      "send 1", 
      "wait 200", 
      "loop 5 {send 2 wait 200}", 
      "send 3", 
      "loop 2 { send a, wait 50 }" 
     }; 

foreach (var element in s) 
{ 
    if(element.Contains("{")) 
    { 
     var index = element.IndexOf("{")+1; 
     var lastIndex = element.IndexOf("}") - index; 
     var sub = element.Substring(index, lastIndex).Trim(); 
     Console.WriteLine(sub); 
    } 
} 
+0

注意你的列表和他的?在你的列表中,「塊」在一行中。在他的名單中並不是。 :-) –

1

這裏是另一種方法:

var list = new List<string> 
     { 
      "send 1", 
      "wait 200", 
      "loop 5 {", 
      "send 2", 
      "wait 200", 
      "}", 
      "send 3", 
      "loop 2 {", 
      "send a", 
      "wait 50", 
      "}" 
     }; 

var indexes = list.Select((x, index) => 
     { 
      if (x.Contains('{') || x.Contains('}')) return index; 
      return -1; 
     }).Where(x => x != -1).ToList(); 
var ranges = new Dictionary<int, int>(); 
for (int i = 0; i < indexes.Count; i += 2) 
{ 
     ranges.Add(indexes[i],indexes[i+1]); 
} 
var resultList = list.Where((item, index) => 
          ranges.Any(r => index > r.Key && index < r.Value)) 
        .ToList(); 

輸出:

enter image description here