将二维数组转换为对象c#

时间:2013-12-12 00:19:04

标签: c# class object google-analytics deserialization

这一切都源于查询Google Analytics数据。对于基本查询,更改的主要因素是维度指标。返回的对象是一个名为GaData的类型,您需要的实际结果驻留在GaData.Rows中。

GaData.Rows的格式如下所示:

Rows

每个维度首先会有一行,在此示例中,“新访问者”有一行,“返回访问者”有第二行。在这些行中,将包含另一组包含Dimension值的行,然后是您指定的每个指标(我只询问了一个指标)。

到目前为止,我的课程设置如下:

public class Results
{
    public List<Dimension> Dimensions { get; set; }
}

public class Dimension
{
    public string Value { get; set; }
    public List<Metric> Metrics { get; set; }
}

public class Metric
{
    public int Value { get; set; }
}

最后,也许它已经很晚了,我的大脑功能不好,但是我将这些数据转换为Results类型有点困难,我认为是因为多层。有什么帮助吗?

修改

我在下面添加了一个答案,说明我最终如何完成它,如果有人有更简洁的例子让我知道!

2 个答案:

答案 0 :(得分:1)

好吧,我不知道Rows里面Ga是什么,但也许这会指向正确的方向。

var results
    = GaData.Rows.Select(x => x.Rows.Select(y =>
          new Dimension { Value = y.Value, Metrics = new List<Metric> {innerRow.Metric}}));

答案 1 :(得分:1)

我最终为GaData创建了一个名为ToDimensionResults()的扩展方法。我不确定我是否能够使用LINQ完成此操作,因为我需要知道某些行的索引(如Dimension Value)。所以我选择循环遍历维度和指标,并手动创建类。注意:如果您在查询中未包含维度,则结果不包含维度值,只包含指标列表,因此这可以适应这种可能性。

    public static Results ToDimensionResults(this GaData ga)
    {
        var results = new Results();
        var dimensions = new List<Dimension>();
        List<Metric> metrics;
        var value = "";
        var metricStartIndex = 1;

        for (var i = 0; i < ga.Rows.Count; i++)
        {
            //accomodate data without dimensions
            if (!string.IsNullOrEmpty(ga.Query.Dimensions))
            {
                value = ga.Rows[i][0].ToString();
            }
            else
            {
                value = "";
                metricStartIndex = 0;
            }

            metrics = new List<Metric>();

            for (var x = metricStartIndex; x < ga.Rows[i].Count; x++)
            {
                metrics.Add(new Metric
                {
                    Value = Convert.ToInt32(ga.Rows[i][x])
                });
            }


            dimensions.Add(new Dimension
            {
                Value = value,
                Metrics = metrics
            });
        }

        results.Dimensions = dimensions;

        return results;
    }