繁体   English   中英

使用Linq在c#list中生成缺少的列表值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM