将新项添加到匿名类型的枚举中

时间:2016-08-11 13:21:21

标签: c# linq list anonymous-types

我必须将新项目添加到匿名类型。我尝试了很多解决方案,但它不起作用。 这是我的代码

代码:

            var literByBeerBrand = (from salesResult in clientSalesResult.Liste.OrderBy(a => a.SaleDay)
                      select new
                      {
                          date = salesResult.SaleDay.ToString("yyyy-MM-dd"),
                          value = salesResult.TotalCl / 5642
                      }).ToList()
                      .GroupBy(k => k.date)
                      .Select(y => new {value = y.Sum(x=>x.value), date = y.First().date});

for (int i = 0; i <= diff.Days; i++)
{
    if (!(literByBeerBrand
        .Any(y => y.date == firstDate.ToString("yyyy-MM-dd"))))
    {
        var t = new
        {
            value = 0,
            date = firstDate.ToString("yyyy-MM-dd")

        };
        // HERE I MUST ADD NEW ITEM TO ANONYMOUS TYPE
    }

    firstDate = firstDate.AddDays(1);
}

我之前尝试过

1) literByBeerBrand.ToList()[literByBeerBrand.ToList().Count()] = t;

2) literByBeerBrand.ToList().Add(new
                {
                    value = 0,
                    date = firstDate.ToString("yyyy-MM-dd")

                });

2 个答案:

答案 0 :(得分:0)

如果不使用var,则无法声明匿名类型的对象集合,因此没有简单的方法可以从头开始添加项目。

但是,您可以将代码重写为LINQ,并在其上使用ToList() / ToArray()

var res = Enumerable
    .Range(0, diff.Days+1)
    .Where(addedDays => literByBeerBrand.All(y => y.date != firstDate.AddDays(addedDays).ToString("yyyy-MM-dd")))
    .Select(addedDays => new {
        value = 0,
        date = firstDate.AddDays(addedDays).ToString("yyyy-MM-dd")
    })
    .ToList();

答案 1 :(得分:0)

匿名类型用于临时使用。你想要的是一个类的列表。

public class BeerType
{
    public int Value { get; set; }
    public DateTime Date { get; set; }
}

List<BeerType> literByBeerBrand = new List<BeerType>();

现在,您可以整天向literByBeerBrand添加项目:

literByBeerBrand.Add(new BeerType { Value = 0, Date = firstDate.ToString("yyyy-MM-dd") };

你很自然地对literByBeerBrand的声明保密;如果人们知道它的实际类型是什么,人们怎么可能帮助你更好地使用它?那将是疯狂的谈话。但是因为你一直把它转换成一个列表,我猜它是某种IEnumerable<T>,其中T是一个匿名类型。

这一行的作用是,它创建一个新的临时List<T>对象,向其添加一个项目,然后抛弃该对象

literByBeerBrand.ToList().Add(new
            {
                value = 0,
                date = firstDate.ToString("yyyy-MM-dd")

            });

这不会让你到任何地方。

相关问题