gpt4 book ai didi

c# - 按元素划分子列表中的列表

转载 作者:太空狗 更新时间:2023-10-30 00:19:45 25 4
gpt4 key购买 nike

我有一个字符串列表:

{"foo", "str1", "str2", ..., "bar", ..., "baz", ...}

我需要获取 "foo""bar""baz" 之间的字符串子列表。

是否可以用 linq 做到这一点?

编辑
我需要一种方法,而无需两次查看列表。

最佳答案

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

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

如果你想得到“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", ...

或者如果您习惯于使用带有副作用的 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" }

或者效率稍微高一点(因为它在第三个停用词后停止处理):

 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" }

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

关于c# - 按元素划分子列表中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17046237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com