如何从列表返回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
你想要一个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
集合。如果速度对你很重要,你应该使用一个或多个字典