从List<string[]>到String[,]

3

我这里有一个问题,看起来我的大脑已经离开了现场,所以我需要你们的帮助。我有一个API-方法,需要一个多维字符串数组。它看起来像这样:

string[,] specialMacroArray = new string[,] { { "#macro#", "text1" }, {"#secondmacro#", "text2"} }

数组的内容是在我的方法中计算的,因此我不能像上面那样编写代码。所以我通过以下方式在代码中使用 List 存储值:

List<string[]> specialMacros = new List<string[]>();
specialMacros.Add(new string[] { "#macro#", text1 });
specialMacros.Add(new string[] { "#secondmacro#", "text2" });

到目前为止还不错......但是现在我希望将列表转换为多维数组。但我搞不清楚该怎么做。

specialMacroArray = specialMacros.ToArray()

我正在使用C#中的.NET 3.5框架。
提前感谢。

2
我认为你需要声明一个新的string[,]变量,并使用嵌套的foreach循环来填充它。 - George Duckett
1
你考虑过使用循环吗? - Gabe
+1,不要问“如何使用LINQ在一行中完成此操作?” - Graham Clark
4个回答

4
为此,您可以直接这样做:
specialMacroArray = new string[specialMacros.Count, 2];
for (int i = 0; i < specialMacros.Count; i++)
{
    specialMacroArray[i, 0] = specialMacros[i][0];
    specialMacroArray[i, 1] = specialMacros[i][1];
}

我被那些Linq方法宠坏了,甚至从未考虑过自己创建数组。谢谢。 - TurBas

3
您可能需要手动完成这个任务,可以按照以下步骤进行操作:
string[,] array = new string[specialMacroArray.Count, 2]

for (int i=0; i<specialMacroArray.Count; ++i)
{
    array[i, 0] = specialMacroArray[i][0];
    array[i, 1] = specialMacroArray[i][1];
}

1

这应该会对你有所帮助

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace sandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string[]> specialMacros = new List<string[]>();
            specialMacros.Add(new string[] { "#macro#", "text1" }); 
            specialMacros.Add(new string[] { "#secondmacro#", "text2" });
            var op = specialMacros.ToMultiDimensionalArray();
            Console.Read();
        }
    }
    public static class ArrayHelper
    {
        public static string[,] ToMultiDimensionalArray(this List<string[]> dt)
        {
            int col = dt.FirstOrDefault().ToList().Count();

            string[,] arr = new string[dt.Count, col];
            int r = 0;
            foreach (string[] dr  in dt)
            {
                for (int c = 0; c < col; c++)
                {
                    arr[r, c] = dr[c];
                }
                r++;
            }
            return arr;
        }
    }


}

根据一些评论,我已经编辑了这个函数,但我相信这个用户可以自己判断并改进代码(如果需要的话)。

 public static string[,] ToMultiDimensionalArray(this List<string[]> dt)
        {
           if (dt.Count == 0 )
               throw new ArgumentException("Input arg has no elemets");
           int col = dt[0].Count();
            string[,] arr = new string[dt.Count, col];
            int r = 0;
            foreach (string[] dr in dt)
            {
                for (int c = 0; c < col; c++)
                {
                    arr[r, c] = dr[c];
                }
                r++;
            }
            return arr;
        }

虽然这个解决方案存在许多问题,但最大的问题可能是它返回 object[,] 而不是 string[,] - Gabe
好的,那个问题已经解决了,我相信任何人都可以解决它...代码还有哪些其他问题? - Ash
将其更改为 public static T[,] ToMultiDimensionalArray<T>(this List<T[]> dt) 就是一个开始。还需要边界检查。此外,dt[0].Length 将给出第一个数组中项目的数量,而不是使用 Linq。 - David_001
@david_001 - 为什么我想要返回T[,],而用户想要一个string[,],其次我对提问者有信心。我相信在我花费的两分钟内,其他人可以检查是否越界异常... dt[0].Length没问题,但我对那个LINQ没有问题.. 我相信这里有不止一种方法来检查第一个项目的长度。 - Ash
想一想 dt.FirstOrDefault().ToList().Count() 是做什么的,看看能否简化它。如果传入一个空列表会发生什么? - Gabe
显示剩余2条评论

0
string[][] specialMacroArray = new string[][] { new string[] { "#macro#", "text1" }, new string[] { "#secondmacro#", "text2" } };
        List<string[]> specialMacros = new List<string[]>();
        specialMacros.Add(new string[] { "#macro1#", "text1" });
        specialMacros.Add(new string[] { "#secondmacro#", "text2" });
        specialMacroArray = specialMacros.ToArray();

运行良好,不需要循环...你所要做的就是将string[,]更改为string[][](这是一个数组的数组,以稍微不同的方式初始化)

更新后的代码:

List<string[,]> specialMacros = new List<string[,]>();
specialMacros.Add(new string[,] { { "#secondmacro#", "text2" }, { "#secondmacro#", "text2" } });
specialMacroArray =specialMacros[0];

我认为您忽略了一个关键点,那就是它是一次外部API调用-他无法更改API方法以接受string [] []而不是string [,]。 - David_001
抱歉,无法完成。也许我表达不清楚,但我使用的是外部API,无法更改API方法的签名。 - TurBas
我的错,我真的没理解到重点。无论如何...我已经改变了代码,也许这样会更合适:List<string[,]> specialMacros = new List<string[,]>();specialMacros.Add(new string[,] { { "#secondmacro#", "text2" }, { "#secondmacro#", "text2" } });specialMacroArray = specialMacros[0]; - Nika G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接