我有一个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'吗?如果不是,它是如何在列表中分解的? –