从 List> 中获取字符串的前两个不同的后继者
本文关键字:List 两个 后继者 获取 字符串 string | 更新日期: 2023-09-27 18:31:36
考虑以下示例
List<string> subList1 = new List<string>();
subList1.Add("start");
List<string> subList2 = new List<string>();
subList2.Add("start");
subList2.Add("string1");
subList2.Add("string2");
List<string> subList3 = new List<string>();
subList3.Add("start");
subList3.Add("string3");
subList3.Add("string4");
subList3.Add("string5");
List<string> subList4 = new List<string>();
subList4.Add("start");
subList4.Add("string3");
subList4.Add("string6");
List<List<string>> mainList = new List<List<string>>();
mainList.Add(subList1);
mainList.Add(subList2);
mainList.Add(subList3);
mainList.Add(subList4);
所以对于搜索字符串 = "开始" , 输出 = {"string1" , "string3"}
对于搜索字符串 = "string3" , 输出 = {"string4" , "string6"}
此外,搜索字符串永远不应该是输出
的一部分有什么建议吗?
更新:如果您的列表可以包含null
值,那么FirstOrDefault
不是一个好主意。取一个项目并检查序列是否为空:
string search = "string3";
var query =
mainList.Select(l => l.SkipWhile(s => s != search).Skip(1))
.Where(l => l.Any()) // sequence should contain items after searched
.Select(l => l.First())
.Distinct() // select distinct results
.Take(2); // take first two items
输出:
string4
string6
解决方案很简单 - 从每个子列表中选择您要查找的项目后的所有项目。如果这生成非空序列,则只需从此序列中选择第一项(这将是搜索项的后继项)。
虽然
我有点晚了,但我只想提一个Iterator
版本。它是这样的:
public static IEnumerable<string> FirstNSuccessiveStrings(int n, string needle, IEnumerable<IEnumerable<string>> lists, bool exceptIfNeedle = true) {
bool afterNeedle = false;
foreach (var list in lists)
foreach (var @string in list) {
if (afterNeedle) {
if (exceptIfNeedle && (@string == needle))
continue;
yield return @string;
if (0 == --n)
yield break;
}
afterNeedle = @string == needle;
}
}
这将产生以下测试结果:
var x = FirstNSuccessiveStrings(2, "start", lists).ToArray();
// x is { "string1", "string3" }
var y = FirstNSuccessiveStrings(2, "string3", lists).ToArray();
// y is { "string4", "string6" }
但是,如果您指定exceptIfNeedle
false
则x
将变为{ "start", "string1" }
。我认为这个问题有点误解。