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

我想知道是否有一种干净的 linq 语法可以仅在一个查询中执行此操作,因为感觉应该有。

我尝试链接 from 子句(一个 SelectMany),但是它将数据拆分得太多了,我无法从单独的数组中进行选择(而是一次获得一个单独的字符串)。

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的是不需要先将所有行读入内存。它像一个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 回答