c# - 创建一个匿名类型的数组

标签 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,但我的问题是我该如何使这部分动态化 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 经常有用。)

关于c# - 创建一个匿名类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10984762/

相关文章:

c# - 为什么匿名类型在 C# 中具有内部可见性?

c# - 在比较 int id 属性时如何强制执行类类型

c# - 我可以获取触发器本身之外的函数名称吗?

c# - 彻底检查电子邮件是否存在,NHibernate,LINQ

c# - LINQ:在集合中的集合中搜索单个对象

c# - EntityFramework 匿名复合键属性名称冲突

c# - 转到 C# 库 | BadImageFormatException异常

c# - 在 ASP.NET Core 2.x 中更改密码

c# - 使用 LINQ 拆分数组

c# - 如何将这一行转换成 vb.net