创建一个匿名类型的数组

时间:2012-06-11 17:27:16

标签: c# linq anonymous-types

我正在尝试从我的程序中的Google图表数据库中获取数据。我想创建一个匿名类型(var)数组,而不是一遍又一遍地重复我的代码:

 public JsonResult GetChartData(int sID, int regionID)
    {

            var testPathOne = from p in _rep.GetMetricsData().GetLHDb().page_loads                                 
                              where p.t_3id == sID && p.test_path_id == 1
                              select new { time = p.time, created_at = p.created_at };

            var testPathTwo = from p in _rep.GetMetricsData().GetLHDb().page_loads
                              where p.t_3id == sID && p.test_path_id == 2
                              select new { time = p.time, created_at = p.created_at };

            var tOne = testPathOne.ToArray();
            var tTwo = testPathTwo.ToArray();
            var name = new { test1 = tOne, test2 = tTwo };
            return Json(name);
        }

我知道我需要一个for循环,所以我可以浏览所有测试路径ID,而不是像p.test_path_id == 1那样对它们进行硬编码,但我的问题是如何让这部分动态{{1} }

修改 我道歉,我想做这样的事情:

var name = new { test1 = tOne, test2 = tTwo };

我希望这是有道理的

2 个答案:

答案 0 :(得分:3)

在这种特殊情况下,最简单的解决方案是给当前匿名的类命名。虽然有一些可以使用的解决方法,但是当您需要开始真正努力使用匿名类型时,您可能不应该使用它。它可以使某些任务更快更容易;如果没有发生这种情况,那么你可能会更好地选择真正的课程。

该解决方案看起来像这样:

//Please give me a real name
public class ClassToBeRenamed
{
    public DateTime Time { get; set; }
    public DateTime CreatedAt { get; set; }
}

List<ClassToBeRenamed[]> myList = new List<ClassToBeRenamed[]>();

for (int i = 0; i < 10; i++)
{
myList.Add((from p in _rep.GetMetricsData().GetLHDb().page_loads
            where p.t_3id == sID && p.test_path_id == i
            select new ClassToBeRenamed { Time = p.time, CreatedAt = p.created_at })
            .ToArray());
}

说完所有这些之后,它仍然有可能。

var myList = new[]{
                from p in _rep.GetMetricsData().GetLHDb().page_loads
                where p.t_3id == sID && p.test_path_id == 1
                select new { time = p.time, created_at = p.created_at }.ToArray()
}.ToList();

for (int i = 2; i < 10; i++)
{
    myList.Add(from p in _rep.GetMetricsData().GetLHDb().page_loads
                where p.t_3id == sID && p.test_path_id == i
                select new { time = p.time, created_at = p.created_at }.ToArray()
                );
}

var myArray = myList.ToArray();

如果真的,非常重要的是你有一个数组,而不是一个列表,那么你最后可以在myList上调用ToArray。重要的是你从列表开始,并且最后只将它转换为数组,因为数组在创建后具有固定的大小。你可以改变他们的内容,但你不能让他们变大或变小。另一方面,List用于随着时间的推移改变它的大小,因此它可以从0或1项开始,然后随着时间的推移添加项,这对于我们在这个特定的上下文中很重要。 (它实际上非常有用,这就是为什么在数组上使用List通常很有用。)

答案 1 :(得分:1)

而不是使用LINQ使用foreach循环。 LINQ更受限制。 还可以在开头定义ArrayLists并随时添加它们。

var test1 = new ArrayList();
var test2 = new ArrayList();
foreach(PageLoad p in _rep.GetMetricsData().GetLHDb().page_loads)
{
    if(p.t_3id == sID)
    {
        var tr = new { time = p.time, created_at = p.created_at };
        switch(p.test_path_id) 
        {
            case 1: test1.Add(tr); break;
            case 2: test2.Add(tr); break;
        }
    }
}
return Json(new { test1, test2, });

您不需要定义属性匿名类型的名称,因为它们默认为变量名称。