簡體   English   中英

創建一個匿名類型的數組

[英]create an array of anonymous type

我正在嘗試從我的程序中的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, });

您不需要定義屬性匿名類型的名稱,因為它們默認為變量名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM