【问题标题】:Parsing an array of objects in C#在 C# 中解析对象数组
【发布时间】:2013-03-07 18:42:34
【问题描述】:

我有一个对象数组,我想将它传递给一个只接受DOUBLENULLSTRINGDATETIME 的方法。因此,当我尝试传入该值时,它会给出一个错误,提示我无法传入任何任意对象,并且必须首先将其解析为 DOUBLENULLSTRINGDATETIME

foreach (var currRow in dataSet.Tables[0].Rows)
{
    var tuple = Com.Tibco.As.Space.Tuple.Create();

    //here is where i loop through the object array
    for (int i = 0; i < currRow.Values.Length; i++)
    {
        //here is where i try to pass it to the method (which doesn't accept it)
        tuple.Put(dataSet.Tables[0].ColumnNames[i], currRow.Values[i]);
    }

    inSpace_.Put(tuple);
}

简而言之,我需要一种方法来解析每个对象并将其转换为适当的对象,然后将其放入元组中。

编辑

这是我尝试做的,但没有成功:

foreach (var currRow in dataSet.Tables[0].Rows)
{
    var tuple = Com.Tibco.As.Space.Tuple.Create();

    for (int i = 0; i < currRow.Values.Length; i++)
    {
        if (currRow.Values[i] != null)
        {
            if (dataSet.Tables[0].ColumnNames[i].GetType().IsEquivalentTo(typeof(DateTime)))
            {
                DateTime value = DateTime.Parse(dataSet.Tables[0].ColumnNames[i].ToString());
                tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
            }
            else if (dataSet.Tables[0].ColumnNames[i].GetType().IsEquivalentTo(typeof(Double)))
            {
                Double value = Convert.ToDouble(dataSet.Tables[0].ColumnNames[i]);
                tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
            }
            else
            {
                string value = dataSet.Tables[0].ColumnNames[i].ToString();
                tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
            }
        }
    }
    inSpace_.Put(tuple);
}

【问题讨论】:

    标签: c# oop parsing data-structures tibco


    【解决方案1】:
    foreach (var currRow in dataSet.Tables[0].Rows)
    {
        var tuple = Com.Tibco.As.Space.Tuple.Create();
    
        for (int i = 0; i < currRow.Values.Length; i++)
        {
            var obj = dataSet.Tables[0].ColumnNames[i], currRow.Values[i];
            var value = null;
            value = obj as double;
            if (!validObject(value)) value as string;
            if (!validObject(value)) value as DateTime;
            tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
        }
    
        inSpace_.Put(tuple);
    }
    
    bool validObject(object obj) { return (null != obj); }
    

    更新,根据您的编辑,我会改用开关类型:

    for (int i = 0; i < currRow.Values.Length; i++)
    {
        var type = obj.GetType();
        var obj = dataSet.Tables[0].ColumnNames[i], currRow.Values[i];
        var value = null;
        switch (type)
        {
            case DateTime:
                value = DateTime.Parse(obj);
                break;
            case double:
                value = Convert.ToDouble(obj);
                break;
            case string:
                value = Convert.ToString(obj);
                break;
        }
        tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
    }
    

    【讨论】:

    • 我认为我们在正确的轨道上,但我不只是想检查并了解它是什么类型。我想根据自己的类型对每个对象进行不同的解析。因此,如果您 getType() 并变成日期时间,我将像 inSpace_.Put(dataSet.Tables[0].ColumnNames[i], (DateTime)currRow.Values[i]); 一样插入它
    • 你试过第一版吗?它将根据它能够转换为的类型转换 obj。
    • 是的,我试试看,你能不能看看我尝试这样做时发布的新代码
    • @Ramie 已更新为替代版本
    • @Ramie 你和哪一个一起去的?
    【解决方案2】:

    如果您在编译时知道类型,请使用Convert.ToDoubleConvert.ToInt32 等。如果您不知道,请使用Convert.ChangeType

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多