考虑以下示例
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);
因此,对于search string =“start”,output = {“string1”,“string3”}
并且对于search string =“string3”,output = {“string4”,“string6”}
此外,搜索字符串不应该是输出的一部分
有什么建议吗?
答案 0 :(得分:3)
更新:如果您的列表中包含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
解决方案很简单 - 从每个子列表中选择您要查找的项目之后的所有项目。如果这产生非空序列,那么只需从该序列中选择第一个项目(即搜索项目的项目后继项目)。
答案 1 :(得分:0)
虽然我有点迟了,但我只想提一个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" }
。我认为这个问题有点误解。