0

次の例を考えてみましょう

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);

したがって、検索文字列 = "start" の場合は output = {"string1" , "string3"}
、検索文字列 = "string3" の場合は output = {"string4" , "string6"}

また、検索文字列は決して出力の一部であってはなりません
何か提案はありますか?

4

2 に答える 2

3

更新: リストにnull値を含めることができる場合FirstOrDefaultは、お勧めできません。代わりに 1 つの項目を取り、シーケンスが空かどうかを確認します。

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

解決策は簡単です。各サブリストから、探しているアイテムの後にすべてのアイテムを選択します。これにより空でないシーケンスが生成された場合は、このシーケンスから最初のアイテム (検索されたアイテムの後続のアイテム) を選択するだけです。

于 2013-09-17T21:54:00.743 に答える
0

少し遅れましたが、Iteratorバージョンの 1 つについて言及したかっただけです。そして、それは次のようになります:

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

ただし、exceptIfNeedlebe を指定するとfalsexになり{ "start", "string1" }ます。質問の意味が少し誤解されていると思います。

于 2013-09-17T22:04:57.483 に答える