从List <list <string>&gt; </list <string>获取字符串的前两个不同后继

时间:2013-09-17 21:49:34

标签: c# string list

考虑以下示例

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

此外,搜索字符串不应该是输出的一部分
有什么建议吗?

2 个答案:

答案 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" }。我认为这个问题有点误解。