1

次のクラスを含むリストがあります

    public class File
{
    public string Name{get;set;}
    public int Year{get;set;}
    public decimal Amount{get;set;}

}

私のリストには、すなわちリストを含めることができます

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の他のアイテムは、欠落している年に対して自動的に生成されることに注意してください

4

2 に答える 2

3
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);
}
于 2013-03-08T11:42:17.667 に答える
0

デフォルト値として、コンストラクターを追加できます。

public class File
{
    public File() { this.Amout = 0; }

    public string Name{get;set;}
    public int Year{get;set;}
    public decimal Amount{get;set;}
}

OrderByについては、この例を見ることができます

于 2013-03-08T11:40:37.663 に答える