4

私はこのコードを持っています:

    private IEnumerable<FindReplacePair> ConstructFindReplacePairs(string inputFilePath)
    {
        var arrays = from line in File.ReadAllLines(Path.GetFullPath(inputFilePath))
                    select line.Split('|');

        var pairs = from array in arrays
                    select new FindReplacePair { Find = array[0], Replace = array[1] };

        return pairs;
    }

この操作を1つのクエリで実行するためのクリーンなlinq構文があるかどうか疑問に思っています。これは、あるべきだと感じているためです。

from句(SelectMany)をチェーンしようとしましたが、データが分割されすぎて、選択する個別の配列にアクセスできませんでした(代わりに、一度に1つずつ個別の文字列を取得しました)。

4

3 に答える 3

4
IEnumerable<FindReplacePair> ConstructFindReplacePairs(string inputFilePath)
{
    return File.ReadAllLines(Path.GetFullPath(inputFilePath))
               .Select(line => line.Split('|'))
               .Select(array => new FindReplacePair { 
                          Find = array[0], 
                          Replace = array[1] 
                });
}

また

IEnumerable<FindReplacePair> ConstructFindReplacePairs(string inputFilePath)
{
    return from line in File.ReadAllLines(Path.GetFullPath(inputFilePath))
           let array = line.Split('|')
           select new FindReplacePair {
              Find = array[0], Replace = array[1]
           };
}

配列に複数の要素があるかどうかを確認するwhere条件を追加することもできます。

于 2013-01-22T12:23:43.820 に答える
2

これがよりきれいかどうかはわかりませんが、少し短いだけです。

IEnumerable<FindReplacePair> allFindReplacePairs = File.ReadLines(inputFilePath)
    .Select(l => new FindReplacePair { Find = l.Split('|')[0], Replace = l.Split('|')[1] });

File.ReadLines最初にすべての行をメモリに読み込む必要がない whichを使用していることに注意してください。のように機能しStreamReaderます。

于 2013-01-22T12:26:22.757 に答える
0

LINQを美しくすることになると、私は通常、単純なループを書き出します。Resharperは、より優れたLINQ最適化を提案します。

foreach (var split in File.ReadAllLines(inputFilePath).Select(l => l.Split('|')))
    yield return new FindReplacePair { Find = split[0], Replace = split[1] };

R#はそれをに変換します

return File.ReadAllLines(inputFilePath).Select(l => l.Split('|')).Select(split => new FindReplacePair { Find = split[0], Replace = split[1] });

つまり、組み込み型を使用し.ToDictionary(l => l[0], l => l[1])たり、メソッドを追加したりすることもできます。FindReplacePair

return File.ReadAllLines(inputFilePath).Select(l => l.Split('|')).Select(FindReplacePair.Create);

public static FindReplacePair Create(string[] split)
{
    return new FindReplacePair { Find = split.First(), Replace = split.Last() };
}
于 2013-01-22T12:37:31.480 に答える