我有一個List<string>
,它看起來像下面的代碼。從兩個項目之間獲取項目
我需要收集{
和}
之間的數據我不確定我應該如何繼續,因此任何信息將不勝感激。
send 1,
wait 200,
loop 5 {,
send 2,
wait 200,
},
send 3,
loop 2 {,
send a,
wait 50,
}
我有一個List<string>
,它看起來像下面的代碼。從兩個項目之間獲取項目
我需要收集{
和}
之間的數據我不確定我應該如何繼續,因此任何信息將不勝感激。
send 1,
wait 200,
loop 5 {,
send 2,
wait 200,
},
send 3,
loop 2 {,
send a,
wait 50,
}
你可以這樣做:
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 }
}
...
}
這將檢查當前行是否與{
結束,如果是的話,一切都增加了一個新的列表,直到}
是在一行中。
你可以這樣做:
var firstIndex = list.FindIndex(r=> r.Contains('{'));
var secondIndex = list.FindIndex(r=> r.Contains('}'));
var result = list.Skip(firstIndex + 1).Take(secondIndex - (firstIndex +1));
其結果將是:
問題的第一個版本不具有指定沒有多段,我想這是在加寬限期。上述版本的答案可以使用字符串的單個部分。爲了得到它與多段工作,一個循環可以使用,如:
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
項目。
哦,LINQ的奇蹟......這比我的回答短得多......: - )但是它是否與原始問題中的多個部分一起工作? –
@ThorstenDittmar,不,它沒有,我沒有看到問題中的多個部分,當它被張貼 – Habib
非常「好」的問題很好的答案。 –
你可以試試這個:
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);
}
}
注意你的列表和他的?在你的列表中,「塊」在一行中。在他的名單中並不是。 :-) –
這裏是另一種方法:
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();
輸出:
列表作爲是什麼?一串字符串?一個ListBox?請更清楚。 –
@ThorstenDittmar對不起,我寫了List(List String),但由於某種原因,它沒有在帖子中包含<>。 –
Ezzy
上面的每行是'List'中的一個單獨的'String'嗎?如果不是,它是如何在列表中分解的? –