以下LINQ读取分隔文件。目前,它只输出recordId。我希望它输出文件中的所有字段,以便我可以对数据执行一些额外的LINQ操作。例如,我想按记录ID分组,按日期排序,然后取(x)结果。
我希望返回csv中的所有字段。我是否需要对变量进行decalre并设置使用索引值,就像我对FirstName,LastName和recordId所做的那样?没什么大不了的,但还有更好的方法吗?
我尝试删除return语句并使用new进行投影但不起作用。
有什么建议吗?
谢谢!
var recipients = File.ReadAllLines(path)
.Select (record =>
{
string[] tokens = record.Split('|');
string FirstName = tokens[2];
string LastName = tokens[4];
string recordId = tokens[13];
return recordId;
}
)
.GroupBy (recordId => {return recordId; } )
.Dump();
答案 0 :(得分:5)
将您的Select()
项目更改为包含所需属性的匿名类型:
.Select (record =>
{
string[] tokens = record.Split('|');
string FirstName = tokens[2];
string LastName = tokens[4];
string recordId = tokens[13];
return new { RecordId = recordId, FirstName, LastName };
}
你也可以改写这个更多的succint:
File.ReadAllLines(path)
.Select(record => record.Split('|'))
.Select(tokens => new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] })
.GroupBy(x => x.RecordId)
.Dump();
答案 1 :(得分:0)
var query = from l in lines选择创建自定义类型,然后你可以对其他任何内容进行分组{来自查询.....}
答案 2 :(得分:0)
注意 - 我实际上并不确定你在“分组”中想要实现的目标 - 你真的希望按ID分组吗?或者这也是OrderBy?
我认为你可以使用匿名类型实现你想要的东西,例如:
var recipients = File.ReadAllLines(path)
.Select(record => record.Split('|'))
.Select(split => new {
TheDate = Date.Parse(tokens[0]), // this might be the wrong index?
FirstName = tokens[2],
LastName = tokens[4],
RecordId = tokens[13],
})
.OrderBy(anon => anon.TheDate)
.Dump();
如果您想使用实际类型,那么Jon Skeet的这篇文章可能有助于作为背景 - http://www.developerfusion.com/article/84468/linq-to-log-files/
答案 3 :(得分:0)
BrokenGlass已经回答了这个问题,但我只想指出这种语法看起来更干净(至少对我而言):
var recipients = File.ReadAllLines(path)
.Select(record => record.Split('|'))
.Select (tokens =>
new {
FirstName = tokens[2],
LastName = tokens[4],
recordId = tokens[5]
}
)
.GroupBy(person => person.recordId )
.Dump();
这里并不需要带有语句块的lambdas。
答案 4 :(得分:0)
我会补充:
var recipients = (from record in File.ReadAllLines(path)
let tokens = record.Split('|')
let record2 = new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] }
group record2 by record2.RecordId
).Dump();
在LINQ非功能语法中。
我将添加另一个变种,它使用select ... into
代替let
。
var recipients = (from record in File.ReadAllLines(path)
select record.Split('|') into tokens
select new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] } into record2
group record2 by record2.RecordId
).Dump();
你需要对它们进行基准测试以找到最快的(它肯定会很有趣......明天早上我会试试)