是否有单行LINQ方式来做到这一点?

时间:2017-09-06 17:20:32

标签: c# linq

想象一下格式为

的输入文本文件
blaha|blahb
blahc|blahd

即。一个管道分隔的文件,有2列。现在,我正在加载它:

File.ReadAllLines(...).Select(x =>
{
   string[] arr = x.Split(new char[] { '|' });
   return new Item(arr[0], arr[1]);
};

如果我将第一行更改为.Select(x => x.Split(new char[] { '|' }),它将返回每个行和列作为数组元素,这不是我想要的。是否有linq“内联”方式来拆分列并新建对象?

4 个答案:

答案 0 :(得分:6)

您可以将多个选项链接在一起。

File.ReadAllLines(...)
    .Select(line => line.Split(new [] { '|' }))
    .Select(arr => new Item(arr[0], arr[1]))

我为这类工作做的一件事就是创建辅助方法,如果要重用这种类型的功能,可以将它们用作方法组。

public class Item {
    ...
    public static Item FromPipeDelimitedText(string text) {
        var arr = text.Split(new [] { '|' };
        return new Item(arr[0], arr[1]);
    }
}

然后

File.ReadAllLines(...).Select(Item.FromPipeDelimitedText);

使用此方法可以独立测试从文件中提取数据的功能

答案 1 :(得分:1)

"冷却器"它是基于意见的,但你不能认为这不是LINQ,或者它有不止一个分号。

var items =
    from line in File.ReadAllLines(myfile)
    let arr = line.Split(new char[] { '|' })
    select new Item(arr[0], arr[1]);

Here's a filddle demonstrating the above codeSystem.IO.File.ReadAllLines(string path)返回string[] - 文件中的一系列行。

答案 2 :(得分:1)

您可以随时执行此操作:

<div class="row">
    <div class="col-md-1">
        <div class="mypanel">
        </div>
    </div>
    <div class="col-md-1">
        <div class="mypanel">
            <div class="text-centered">
                <button type="button">Click</button>
            </div>
        </div>
    </div>
    <div class="col-md-1">
        <div class="mypanel">

        </div>
    </div>
</div>

然而,假设行总是在[至少]两个中分裂,这从个人经验中不容易被错误处理。

我建议避免使用单行方法,除非您完全确定没有问题行或使用函数委托来管理实例化和错误处理。

答案 3 :(得分:0)

使用SelectMany

// returns IEnumerable<Item>
File.ReadAllLines(...).SelectMany(x =>
{
   string[] arr = x.Split(new char[] { '|' });
   return new Item(arr[0], arr[1]);
}
相关问题