您需要修剪列。
.Select(line => line.Split(',').Select(s => s.Trim()).ToList())
遵循说明
如何通过EndDate对它们进行排序,并仅为每个组获取第n个值,而不是特定日期值?
此处是遵循问题概述步骤的版本。
var data = @"FilmMaker,MovieTitle,EndDate
FunnyM,F1,20191210
FunnyM,F2,20191211
FunnyM,F3,20191212
FunnyM,F4,20191213
FunnyM,F5,20191214
SadM,S1,20191210
SadM,S2,20191211
SadM,S3,20191212
SadM,S4,20191213
SadM,S5,20191214
ScaryM,C1,20191210
ScaryM,C2,20191211
ScaryM,C3,20191212
ScaryM,C4,20191213
ScaryM,C5,20191214";
var d = data.Split("\r\n")
.Skip(1)
.Select(line => line.Split(',').Select(s => s.Trim()).ToList())
.Select( a => new { FilmMaker = a[0],MovieTitle = a[1],EndDate= DateTime.ParseExact(a[2],"yyyyMMdd",CultureInfo.InvariantCulture)}) // No error handling for brevity
// We have crossed the csv/object boundary
// 1) group them by FilmMaker
.GroupBy( o => o.FilmMaker )
// 2) sort them by EndDate
// 3) select movies that ends after 2019-12-10
// 4) select only that ends the second earliest
// NOTE: This is quite fragile - if there is no 2nd earliest movie this will throw
.Select( g => new { FilmMaker = g.Key,Movie = g.Where( m => m.EndDate > new DateTime(2019,12,10)).OrderBy( m => m.EndDate).Skip(1).First() })
// 5) make a dictionary that has keys as MovieTitle and also has other two columns as values.
.ToDictionary( m => m.Movie.MovieTitle,m => new { FilmMaker = m.FilmMaker,EndDate = m.Movie.EndDate.ToString("yyyyMMdd")});
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(d));
{
"F3":{"FilmMaker":"FunnyM","EndDate":"20191212"},"S3":{"FilmMaker":"SadM","C3":{"FilmMaker":"ScaryM","EndDate":"20191212"}
}
,
您可以将CSV转换为中间类,然后在创建最终词典之前将其用于处理。这将使您能够将问题分解为多个步骤并提高可读性。例如,
public class Movie
{
public string FilmMaker{get;set;}
public string MovieTitle{get;set;}
public DateTime EndDate{get;set;}
}
假设电影类的定义如上所述,您可以按以下方式将CSV排序到字典。
var csvCollection = csv.Split(new []{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries)
.Skip(1)
.Select(line => line.Split(',').Select(c=>c.Trim()).ToList());
var movieCollection = csvCollection.Select(x=> new Movie
{
FilmMaker = x[0],MovieTitle = x[1],EndDate = DateTime.ParseExact(x[2],CultureInfo.InvariantCulture)
});
var result = movieCollection.Where(x=> x.EndDate> new DateTime(2019,10))
.OrderBy(x=>x.EndDate)
.GroupBy(x=>x.FilmMaker)
.Select(x=> x.Skip(1).First())
.ToDictionary(key=>key.MovieTitle,value=>new []{$"FilmMaker:{value.FilmMaker}",$"EndDate:{value.EndDate.Year}{value.EndDate.Month}{value.EndDate.Day}"});
输出
,
使用诸如CsvHelper之类的库来解析csv,请勿手动执行。
一旦您读完记录,就只需要过滤,排序,分组和选择所需的结果即可。
ID,Name,Result,Device
1,John,Success,Windows
2,Felix,Fail,Windows
3,Suzie,Windows
4,Angie,Windows,Waiting,IOS,Retry,5,Michel,Mac,6,Robert,Windows
7,James,
本文链接:https://www.f2er.com/3155191.html