我想构建二维数组的字符串,其中一维的长度为2.与此相似
string[,] array = new string[,]
{
{"a", "b"},
{"c", "d"},
{"e", "f"},
{"g", "h"}
}
否则
List<string[]> list = new List<string[]>();
list.Add(new string[2] {"a", "b"});
list.Add(new string[2] {"c", "d"});
list.Add(new string[2] {"e", "f"});
list.Add(new string[2] {"g", "h"});
list.ToArray();
给了我
string[][]
但不是
string[,]
阵列。
好奇,是否有一些动态构建的技巧
string[,]
某种方式数组?
答案 0 :(得分:18)
你可以这样做。
List<KeyValuePair<string, string>>
这个想法是Key Value Pair会模仿你复制的字符串数组。
答案 1 :(得分:4)
好吧,你可以合理地轻松编写扩展方法来完成它。像这样的东西(只测试很轻):
public static T[,] ToRectangularArray<T>(this IEnumerable<T[]> source)
{
if (!source.Any())
{
return new T[0,0];
}
int width = source.First().Length;
if (source.Any(array => array.Length != width))
{
throw new ArgumentException("All elements must have the same length");
}
T[,] ret = new T[source.Count(), width];
int row = 0;
foreach (T[] array in source)
{
for (int col=0; col < width; col++)
{
ret[row, col] = array[col];
}
row++;
}
return ret;
}
上面的代码使用T []作为元素类型,这有点遗憾。由于通用不变性,我目前无法使源IEnumerable<IEnumerable<T>>
变得更好。另一种方法是引入一个带约束的新类型参数:
public static T[,] ToRectangularArray<T,U>(this IEnumerable<U> source)
where U : IEnumerable<T>
有点毛茸茸,但应该有效。 (显然,实现也需要一些改变,但基本原理是相同的。)
答案 2 :(得分:2)
唯一的方法是自己实现ToArray()
功能。您可以在自己的集合中实现它(即StringTupleCollection
)。这可以与ArrayList
相同(即内部数组根据需要增加)。
但是,我不确定[x,2]
优于[x][2]
(甚至List<string[2]>
的优势是否足以保证这一努力。
您还可以将StringTupple
课程编写为:
public class StringTupple : KeyValuePair<string, string>
{
}
答案 3 :(得分:1)
您可以只使用一个结构。我在手动比较XML节点时会这样做。
private struct XmlPair
{
public string Name { set; get; }
public string Value { set; get; }
}
List<XmlPair> Pairs = new List<XmlPair>();
答案 4 :(得分:0)
List<string[]>
无法做到这一点,因为string[,]
类型与string[]
不同。
答案 5 :(得分:0)
当我必须检索控制器上复选框的值作为我的模型时,KeyValuePair对我不起作用。列表列表为空。
foreach (KeyValuePair<string, bool> Role in model.Roles){...}
KeyValuePair结构没有默认的无参数构造函数,并且无法由模型绑定器实例化。我建议您的视图的自定义模型类只具有这些属性。 ASP.NET MVC 3 binding user control of type KeyValuePair to ViewModel
我在以下链接CheckboxList in MVC3.0
找到了一个不使用html帮助程序的复选框列表的实现