如何将 2D 字符串数组转换为 2D [整数, 双精度, 布尔, .] 数组

本文关键字:数组 2D 整数 布尔 双精度 转换 字符串 | 更新日期: 2023-09-27 18:31:22

我的目标是这些。

  1. 将数据类转换为字典。
  2. 将该字典保存/加载到 TXT、数据库等。
  3. 将字典转换为数据类

我想我解决了大部分问题,但一个问题仍然重新邮寄。

问题是将 2D 字符串数组转换为 2D 它是原始数据类型数组。

我已经成功地将字符串转换为原始数据类型。喜欢这个

    public static void SetFieldValue(Object target, FieldInfo fieldInfo, string value)
    {
        string fieldType = fieldInfo.FieldType.Name;
        fieldType = fieldType.ToLower();
        switch (fieldType)
        {
            case "boolean":
                bool b;
                fieldInfo.SetValue(target, bool.TryParse(value, out b) ? b : false);
                break;
            case "int32":
                int n;
                fieldInfo.SetValue(target, int.TryParse(value, out n) ? n : 0);
                break;
            case "double":
                double d;
                fieldInfo.SetValue(target, double.TryParse(value, out d) ? d : 0);
                break;
            case "string":
                fieldInfo.SetValue(target, value);
                break;
        }
    }

我已经成功地将 1d 字符串数组转换为 1d 原始数据类型数组。喜欢这个

    public static void SetFieldValue(Object target, FieldInfo fieldInfo, string[] arr)
    {
        string fieldType = fieldInfo.FieldType.Name;
        fieldType = fieldType.ToLower();
        fieldType = fieldType.Replace("[]", "");
        switch (fieldType)
        {
            case "boolean":
                bool b;
                bool[] arr_b = Array.ConvertAll(arr, s => bool.TryParse(s, out b) ? b : false);
                fieldInfo.SetValue(target, arr_b);
                break;
            case "int32":
                int n;
                int[] arr_n = Array.ConvertAll(arr, s => int.TryParse(s, out n) ? n : 0);
                //int[] arr_n1 = Array.ConvertAll(arr, int.Parse);
                //int[] arr_n2 = arr.Select(s => int.TryParse(s, out n) ? n : 0).ToArray();
                fieldInfo.SetValue(target, arr_n);
                break;
            case "double":
                double d;
                double[] arr_d = Array.ConvertAll(arr, s => double.TryParse(s, out d) ? d : 0);
                fieldInfo.SetValue(target, arr_d);
                break;
            case "string":
                fieldInfo.SetValue(target, arr);
                break;
        }
    }

但是,处理 2D 数组时我应该怎么做?

    public static void SetFieldValue(Object target, FieldInfo fieldInfo, string[,] arr)
    {
        string fieldType = fieldInfo.FieldType.Name;
        fieldType = fieldType.ToLower();
        fieldType = fieldType.Replace("[,]", "");
        int n;
        double d;
        bool b;
        switch (fieldType)
        {
            case "boolean":
                //bool[] arr_b = Array.ConvertAll(arr, s => bool.TryParse(s, out b) ? b : false);
                //fieldInfo.SetValue(target, arr_b);
                break;
            case "int32":
                //int[,] arr_n = Array.ConvertAll(arr, s => int.TryParse(s, out n) ? n : 0);
                //fieldInfo.SetValue(target, arr_n);
                break;
            case "double":
                //double[,] arr_d = Array.ConvertAll(arr, s => double.TryParse(s, out d) ? d : 0);
                //fieldInfo.SetValue(target, arr_d);
                break;
            case "string":
                fieldInfo.SetValue(target, arr);
                break;
        }
    }

而且,我需要解决这个问题的是因为我无法获得 GetType()。数组位置的 GetField。我放弃了获得数组[n_th,m_th]的数组[行,列]的GetField。

如何将 2D 字符串数组转换为 2D [整数, 双精度, 布尔, .] 数组

最简单的方法是遍历数组:

string[,] strings = new string[,] { { "1", "2", "3" }, { "4", "5", "6" } };
int[,] ints = new int[strings.GetLength(0), strings.GetLength(1)];
for (int i = 0; i < strings.GetLength(0); i++)
{
    for (int j = 0; j < strings.GetLength(1); j++)
    {
        int.TryParse(strings[i, j], out ints[i, j]);
    }
}

请参考以下示例代码,并将其应用于您的代码。

static string[,] ToStringArray(object arg)
{
    string[,] result = null;
    if (arg is Array)
    {
        int rank = ((Array)arg).Rank;
        if (rank == 2)
        {
            int columnCount = ((Array)arg).GetUpperBound(0);
            int rowCount = ((Array)arg).GetLength(0);
            result = new string[rowCount, columnCount];
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    result[i, j] = ((Array)arg).GetValue(i, j).ToString();
                }
            }
        }
    }
    return result;
}

因为 fieldInfo.SetValue 函数不支持隐式转换,所以我需要为每种数据类型分配数组,即使我不想要。所以,这是我的方法。谢谢你的帮助,巴拉,用户1793963。

    public static void SetFieldValue(Object target, FieldInfo fieldInfo, string[,] arr)
    {
        string fieldType = fieldInfo.FieldType.Name;
        fieldType = fieldType.ToLower();
        fieldType = fieldType.Replace("[,]", "");
        // 0. string return
        switch (fieldType)
        {
            case "string":
                fieldInfo.SetValue(target, arr);
                return;
                break;
        }
        // 1. initialize
        int n;
        double d;
        bool b;
        //object[,] output = new object[arr.GetLength(0), arr.GetLength(1)];
        int[,] output_n = new int[arr.GetLength(0), arr.GetLength(1)];
        bool[,] output_b = new bool[arr.GetLength(0), arr.GetLength(1)];
        double[,] output_d = new double[arr.GetLength(0), arr.GetLength(1)];
        // 2. convert
        for (int i = 0; i < arr.GetLength(0); i++)
        {
            for (int j = 0; j < arr.GetLength(1); j++)
            {
                switch (fieldType)
                {
                    case "boolean":
                        output_b[i, j] = bool.TryParse(arr[i, j], out b) ? b : false;
                        break;
                    case "int32":
                        output_n[i, j] = int.TryParse(arr[i, j], out n) ? n : 0;
                        break;
                    case "double":
                        output_d[i, j] = double.TryParse(arr[i, j], out d) ? d : 0;
                        break;
                }
            }
        }
        // 2. setvalue
        //fieldInfo.SetValue(target, output);
        switch (fieldType)
        {
            case "boolean":
                fieldInfo.SetValue(target, output_b);
                break;
            case "int32":
                fieldInfo.SetValue(target, output_n);
                break;
            case "double":
                fieldInfo.SetValue(target, output_d);
                break;
        }
    }

看起来你快到了。你可以尝试这样的事情:

将函数更改为类似于@user1793963答案的内容,在一个switch语句中创建一个动态数组(这将允许它是任何类型的),并将case语句放在循环中。 所以它看起来像下面这样:

public static void SetFieldValue(Object target, FieldInfo fieldInfo, string[,] arr)
{
    string fieldType = fieldInfo.FieldType.Name;
    fieldType = fieldType.ToLower();
    fieldType = fieldType.Replace("[,]", "");
    int n;
    double d;
    bool b;
    dynamic output;
    // this should be in a different method
    switch (fieldType)
    {
        case "boolean":
            output = new bool[arr.GetLength(0), arr.GetLength(1)];
            break;
        case "int32":
            output = new int[arr.GetLength(0), arr.GetLength(1)];
            break;
        case "double":
            output = new double[arr.GetLength(0), arr.GetLength(1)];
            break;
        default:
            output = new string[arr.GetLength(0), arr.GetLength(1)];
            break;
    }
    for (int i = 0; i < arr.GetLength(0); i++)
    {
        for (int j = 0; j < arr.GetLength(1); j++)
        {
            switch (fieldType)
            {
                case "boolean":
                    output[i, j] = bool.TryParse(arr[i, j], out b) ? b : false;
                    break;
                case "int32":
                    output[i, j] = int.TryParse(arr[i, j], out n) ? n : 0;
                    break;
                case "double":
                    output[i, j] = double.TryParse(arr[i, j], out d) ? d : 0;
                    break;
                default:
                    output[i, j] = arr[i, j];
                    break;
            }
        }
    }
    fieldInfo.SetValue(target, output);
}

附带说明一下,由于您正在序列化,我只会使用JavaScriptSerializer(首选方法,使用Newtonsoft JSON.Net),XmlSerializer或使用BinaryFormatter进行深度克隆,因此您无需手动来回进行所有转换。这个问题对如何序列化字典有一个很好的答案:在 C# 中保存字典<字符串、Int32> - 序列化?。


如果这仍然没有帮助,请更新您的问题,说明您如何拨打SetFieldValue,以便我们了解正在发生的事情。