如何从列表返回csv值< >

本文关键字:csv 返回 列表 | 更新日期: 2023-09-27 18:10:52

我有List<item>包含如下名称,年份和值的项目集合

Names   years  Values
=====   =====  =====
Smith   2010   777
Smith   2011   999
Jones   2007   01
Jones   2008   03
Jones   2009   05
Jones   2010   06
Jones   2011   09

我想写一个LINQ查询,它返回一个CSV值字符串,其中"name"后面跟着"values",从最早的年份开始(在本例中是2007年),如果"years"数据缺失/缺席(在本例中Smith没有2007年,2008年,2009年的任何值),那么用0代替结果

如下:

Results:
Smith,0,0,0,777,999
Jones,01,03,05,06,09

如何从列表返回csv值< >

你想要一个Linq解决方案,所以这里是:

list
    .Select(i=>i.Name)
    .Distinct()
    .Select(name => 
       name + "," + 
       String.Join(",", (from y in list.Select(i=>i.Year).Distinct().OrderBy(y=>y)
                        join item in list.Where(i=>i.Name == name) 
                        on y equals item.Year into outer
                    from o in outer.DefaultIfEmpty()
                    select ((o == null) ? "0" : o.Value.ToString()) 
                         ).ToArray()));

你可以在这里看到它的作用:
http://www.coderun.com/ide/?w=9QASFzOJrECO3SJDdUo93A
点击"Run"

你可以这样做:

var minYear = items.Min(i => i.Year);
var maxYear = items.Max(i => i.Year);
var names = items.Select(i => i.Name).Distinct();
using (TextWriter writer = …)
{
    foreach (var name in names)
    {
        writer.Write(name);
        for (int y = minYear; y <= maxYear; y++)
        {
            writer.Write(',');
            var value = items.Where(i => i.Name == name && i.Year == y)
                             .Select(i => i.Value)
                             .SingleOrDefault();
            writer.Write(value);
        }
        writer.WriteLine();
    }
}
但是,这将不必要地多次遍历items集合。如果速度对你很重要,你应该使用一个或多个字典