有没有办法定义List<>两个元素字符串数组?

时间:2008-11-13 07:01:00

标签: c# arrays generics data-structures

我想构建二维数组的字符串,其中一维的长度为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[,] 
某种方式

数组?

6 个答案:

答案 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帮助程序的复选框列表的实现