4

プログラムで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);
        }

このようにハードコーディングする代わりに、すべてのテストパスIDを通過できるように、forループが必要になることはわかっていますp.test_path_id == 1が、私の質問は、この部分を動的にする方法です。var name = new { test1 = tOne, test2 = tTwo };

編集: お詫び申し上げます。次のようなことをしたいと思います。

name is an array

for loop:
    testPath = query
    name.Add(testPath)

それが理にかなっていることを願っています

4

2 に答える 2

4

この特定の場合の最も簡単な解決策は、現在匿名のクラスに名前を付けることです。使用できる回避策はありますが、匿名タイプを使用するために本当に一生懸命働き始める必要がある場合は、おそらくそれを使用すべきではありません。特定のタスクをより迅速かつ簡単にするためにあります。それが起こらない場合は、実際のクラスを使用したほうがよいでしょう。

そのソリューションは次のようになります。

//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();

リストではなく配列を使用することが本当に非常に重要な場合は、ToArray最後にmyListを呼び出すことができます。配列は作成後に固定サイズになるため、リストから始めて、最後に配列に変換するだけでよいことが重要です。それらの内容を変更することはできますが、大きくしたり小さくしたりすることはできません。一方、リストは時間の経過とともにサイズを変更するように設計されているため、0または1のアイテムから始めて、時間の経過とともにアイテムを追加できます。これは、この特定のコンテキストで重要です。(実際には非常に頻繁に役立ちます。そのためList、配列上で使用すると頻繁に役立ちます。)

于 2012-06-11T18:00:38.770 に答える
2

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

プロパティの名前はデフォルトで変数名になっているため、匿名タイプを定義する必要はありません。

于 2014-03-17T14:01:25.873 に答える