C# 使用LINQ读取已删除的文件

C# 使用LINQ读取已删除的文件,c#,linq,.net-4.0,C#,Linq,.net 4.0,以下LINQ读取带分隔符的文件。目前,它只输出recordId。我希望它输出文件中的所有字段,这样我就可以对数据执行一些额外的LINQ操作。例如,我想按recordId分组、按日期排序和takex结果 我希望返回csv中的所有字段。我是否需要像对FirstName、LastName和recordId那样,标记一个变量并设置使用索引值?没什么大不了的,但有更好的办法吗 我尝试删除return语句并使用new进行投影,但没有成功 有什么建议吗 谢谢 var recipients = File.Rea

以下LINQ读取带分隔符的文件。目前,它只输出recordId。我希望它输出文件中的所有字段,这样我就可以对数据执行一些额外的LINQ操作。例如,我想按recordId分组、按日期排序和takex结果

我希望返回csv中的所有字段。我是否需要像对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();
将“选择”更改为包含所有所需属性的匿名类型:

.Select (record => 
{
  string[] tokens = record.Split('|');

  string FirstName = tokens[2];
  string LastName = tokens[4];
  string recordId = tokens[13];

  return  new { RecordId = recordId, FirstName, LastName };
}
您还可以更简洁地重写以下内容:

File.ReadAllLines(path)
    .Select(record  => record.Split('|'))
    .Select(tokens => new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] })
    .GroupBy(x => x.RecordId)
    .Dump();
将“选择”更改为包含所有所需属性的匿名类型:

.Select (record => 
{
  string[] tokens = record.Split('|');

  string FirstName = tokens[2];
  string LastName = tokens[4];
  string recordId = tokens[13];

  return  new { RecordId = recordId, FirstName, LastName };
}
您还可以更简洁地重写以下内容:

File.ReadAllLines(path)
    .Select(record  => record.Split('|'))
    .Select(tokens => new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] })
    .GroupBy(x => x.RecordId)
    .Dump();

var query=从行中的l选择创建cutom类型,然后您可以查看组或其他任何内容{从行中查询….}

var query=从行中的l选择创建cutom类型,然后您可以查看组或其他任何内容{从行中查询….}

注意-我不确定您在分组中想要达到什么目标-您真的希望按Id分组吗?还是这也是一个订货人

我认为您可以使用匿名类型实现所需的功能,例如:

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的这篇文章可能有助于作为背景-

注意-我不确定您在分组中试图实现什么-您真的希望按Id分组吗?还是这也是一个订货人

我认为您可以使用匿名类型实现所需的功能,例如:

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的这篇文章可能有助于作为背景-

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

这里不需要使用带有语句块的lambda。

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();
这里不需要使用带有语句块的lambda。

我将添加:

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。。。把它放进去而不是放进去

您需要对它们进行基准测试,以找到最快的,这肯定会很有趣。。。明天早上我将尝试

我将添加:

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。。。把它放进去而不是放进去


您需要对它们进行基准测试,以找到最快的,这肯定会很有趣。。。明天早上我试试看

有一个基于日期的订单。我只是在本地版本的代码中添加了这个。我希望记录按recordId分组,并按Top上最近的日期降序排序如果按recordId分组,那么之后您只能访问recordId和分组的聚合方法,例如最小值、最大值、平均值-因此我真的不明白您以后将如何获得日期-这将从何而来?你真的想让结果先按recordId再按日期排序吗?有一个基于日期的orderBy。我只是在本地版本的代码中添加了这个。我希望记录按recordId分组,并按Top上最近的日期降序排序如果按recordId分组,那么之后您只能访问recordId和分组的聚合方法,例如最小值、最大值、平均值-因此我真的不明白您以后将如何获得日期-这将从何而来?您真的希望结果按recordId排序,然后按日期排序吗?