ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-01 07:08:11  阅读:277  来源: 互联网

标签:anonymous-types linq c


我正在尝试从程序中的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.重要的是要从列表开始,并且仅在最后将其转换为数组,因为数组一旦创建便具有固定的大小.您可以更改它们的内容,但不能放大或缩小它们.另一方面,列表的目的是随着时间变化其大小,因此它可以从0或1个项目开始,然后随着时间的推移添加项目,这对于我们在此特定情况下很重要. (实际上经常有用,这就是为什么使用List over array经常有用的原因.)

标签:anonymous-types,linq,c
来源: https://codeday.me/bug/20191101/1982000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有