创建匿名类型的数组

本文关键字:数组 类型 创建 | 更新日期: 2023-09-27 18:36:59

我正在尝试从数据库中获取程序中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,但我的问题是我如何使这部分动态var name = new { test1 = tOne, test2 = tTwo };

编辑:很抱歉,我想做这样的事情:

name is an array
for loop:
    testPath = query
    name.Add(testPath)

我希望这是有道理的

创建匿名类型的数组

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

该解决方案如下所示:

//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经常很有用的原因。

不使用 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, });

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