2014-02-17 29 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