如何跳过一些二维数组的初始值设定项?

时间:2014-05-27 09:55:58

标签: c# .net arrays initialization

我有以下定义

static readonly String[,] allItems = {
    { "Alpha", null },
    { "Beta", "Magic" },
    { "Gamma", null },
    // more items follow
}

在第一列中,必须将所有项初始化为一些字符串文字。在第二列中,只有一小部分项必须初始化为字符串文字而其他所有项都为空。

我现在需要添加第三列,它主要包含null s,我很乐意省略所有这些内容。

有没有办法以某种方式省略那些null值?

5 个答案:

答案 0 :(得分:3)

我不确定这是否是您正在寻找的答案,但您是否考虑过使用对象。然后,您可以提供默认值,只提供不同的值。

例如

public class YourObject{    
    public string Name {get;set;}
    public string Value {get;set;}
    public string SomethingElse {get;set;}

    public YourObject()
    {
        //provide defaults here
        SomethingElse = "";
    }

}

然后创建可以像这样创建的对象

static readonly List<YourObject> allItems = new List<YourObject>{
    new YourObject{ Name = "Alpha" },
    new YourObject{ Name = "Beta", Value = "Magic" },
    new YourObject{ Name = "Gamma", SomethingElse = "Hello" }
    // more items follow
}

Sriram Sakthivel在我打字时建议这样做;)

答案 1 :(得分:0)

试用清单。 这将允许您只添加必需的元素。您可以稍后在

添加更多元素

列出allList = new List; allList.Add()

答案 2 :(得分:0)

您可以创建一个类,然后使用集合:

class MyClass
{
   public string Prop1 {get;set;}
   public string Prop2 {get;set;}   
   public MyClass(string prop1, string prop2 = null)
   {
       this.Prop1 = prop1;
       this.Prop2 = prop2   
   }
}

现在,您可以使用List<T>

var list = new List<MyClass>()
{
    new MyClass("Alpha"),
    new MyClass("Beta" , "Magic"),
    new MyClass("Gamme")    
}

答案 3 :(得分:0)

如果您不确定列数,并且想要像表一样定义,那么我建议您使用DataTable。因此,您可以定义列类型并强制执行任何约束。这样你甚至可以使用Linq来操纵值。

以下是示例代码:

DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("Drug", typeof(string));
table.Columns.Add("Patient", typeof(string));
table.Columns.Add("Date", typeof(DateTime));

//
// Here we add five DataRows.
//
table.Rows.Add(25, "Indocin", "David", DateTime.Now);
table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
return table;

答案 4 :(得分:0)

您可以编写一个用于建模锯齿状二维数组的类,该数组可以使用集合初始值设定项进行初始化。该类必须实现IEnumerable,并且应该有适当的Add方法:

class Table<T> : IEnumerable<IEnumerable<T>> {

  readonly List<T[]> rows = new List<T[]>();

  public void Add(params T[] row) {
    rows.Add(row);
  }

  public IEnumerator<IEnumerable<T>> GetEnumerator() {
    return rows.GetEnumerator();
  }

  IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
  }

}

然后您可以直接使用此类来实现索引器(public T this[Int32 rowIndex, Int32 columnIndex] { get { ... } }),但更好的解决方案可能是创建一个将表转换为数组的方法:

public T[,] ToArray() {
  var columnCount = rows.Max(row => row.Length);
  var array = new T[rows.Count, columnCount];
  for (var rowIndex = 0; rowIndex < rows.Count; rowIndex += 1)
    for (var columnIndex = 0; columnIndex < columnCount; columnIndex += 1) {
      var row = rows[rowIndex];
      array[rowIndex, columnIndex] = columnIndex < row.Length
        ? row[columnIndex] : default(T);
    }
  return array;
}

然后,您可以使用以下代码初始化二维数组:

static readonly String[,] allItems = new Table<String> {
  { "Alpha" },
  { "Beta", "Magic" },
  { "Gamma" },
}.ToArray();