[英]Generate missing list values in c# list using Linq
我有一个包含以下类的列表
public class File
{
public string Name{get;set;}
public int Year{get;set;}
public decimal Amount{get;set;}
}
我的清单可能包含ie List
Name="File 1" Year=2011 Amount=200
Name="File 2" Year=2012 Amount=400
Name="File 3" Year 2013 Amount=500
我想将上面的列表转换为包含以下值
Name="File 1" Year=2011 Amount=200
Name="File 1" Year=2012 Amount=0
Name="File 1" Year 2013 Amount=0
Name="File 2" Year=2011 Amount=400
Name="File 2" Year=2012 Amount=0
Name="File 2" Year 2013 Amount=0
Name="File 3" Year 2011 Amount=0
Name="File 3" Year=2012 Amount=0
Name="File 3" Year 2013 Amount=500
请注意,缺少年份会自动生成金额为0的其他项目
foreach(var name in files.Select(x => x.Name).Distinct())
foreach(var year in files.Select(x => x.Year).Distinct())
{
var amount = (from file in files
where file.Name == name
&& file.Year == year
select (decimal?)file.Amount).SingleOrDefault() ?? 0M;
Console.WriteLine("Name={0}, Year={1}, Amount={2}",
name, year, amount);
}
显然它可以被优化 - 特别是通过字典查找金额; 也许:
var amounts = files.ToDictionary(
file => new {file.Name,file.Year}, file => file.Amount);
foreach(var name in files.Select(file => file.Name).Distinct())
foreach(var year in files.Select(file => file.Year).Distinct())
{
decimal amount;
if(!amounts.TryGetValue(new {file.Name,file.Year}, out amount) amount = 0M;
Console.WriteLine("Name={0}, Year={1}, Amount={2}",
name, year, amount);
}
对于默认值,您可以添加构造函数:
public class File
{
public File() { this.Amout = 0; }
public string Name{get;set;}
public int Year{get;set;}
public decimal Amount{get;set;}
}
对于OrderBy,您可以查看此示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.