按元素划分子列表中的列表

dik*_*yyn 4 c# linq

我有一个字符串列表:

{"foo", "str1", "str2", ..., "bar", ..., "baz", ...}
Run Code Online (Sandbox Code Playgroud)

我需要之间的串子列表"foo","bar""baz".

用linq可以做到这一点吗?

编辑
我需要一个方法,而不是两次查看列表.

p.s*_*w.g 6

您可以这样做以细化任何两个其他元素之间的所有元素:

var strings = new[] { "foo", "str1", "str2", ... "bar", ... "baz" };
var between = strings.SkipWhile(s => s != "foo").Skip(1)
                     .TakeWhile(s => s != "bar"); // "str1", "str2", ...
Run Code Online (Sandbox Code Playgroud)

如果你想获得"foo"和"baz"之间的所有内容,除了"bar",请使用此(假设订单为"foo","bar","baz"):

var strings = new[] { "foo", "str1", "str2", ... "bar", ... "baz" };
var between = strings.SkipWhile(s => s != "foo").Skip(1)
                     .TakeWhile(s => s != "baz")
                     .Where(s => s != "bar"); // "str1", "str2", ...
Run Code Online (Sandbox Code Playgroud)

或者,如果您对使用具有副作用的Linq查询感到满意,则可以通过某些"停止"单词对输入列表进行分区:

 var stops = new[] { "foo", "bar", "baz" };
 var strings = new[] { "foo", "str1", "str2", "bar", "str3", "baz" };
 var p = -1;
 var partitions = 
     from s in strings
     let i = Array.IndexOf(stops, s) 
     group s by p = i == -1 ? p : i into g
     where g.Key == 0 || g.Key == 1
     select g.Skip(1); // { "str1", "str2" }, { "str3" }
Run Code Online (Sandbox Code Playgroud)

或稍高效(因为它在第三个停用词之后停止处理):

 var partitions = 
     (from s in strings
      let i = Array.IndexOf(stops, s) 
      group s by p = i == -1 ? p : i)
     .SkipWhile(g => g.Key < 0)
     .Take(2)
     .Select(g => g.Skip(1)); // { "str1", "str2" }, { "str3" }
Run Code Online (Sandbox Code Playgroud)

现在,这个方法在边缘有点粗糙,当它涉及"foo"之前或"baz"之后的项目时有点繁琐,但是如果因为你只是在寻找"foo"和"baz"之间的项目,它应该适合你.它具有额外的好处,即停用词的顺序不会影响结果.