2011-06-13 67 views
4

我想要创建一个c#数据结构,它具有可变数量的列和可变数量的行。我会将值插入“单元格”中。我想能够使用字符串而不是整数索引列和行,以便我可以按如下方式处理这些单元格:infotable(“pete”,“monday”)= 3或infotable(“mike”,“星期五“)++。当我遇到不存在的列名或行名时,我会将其添加到结构中。我没有保证每个嵌套集合都包含与所有其他嵌套集合相同的键(除非我手动管理)。我曾经在使用DataTables进行思考,但后来我无法使用字符串对行进行索引。按列和行字符串值键入的C#矩阵

什么是解决我的要求最好的方法?

谢谢。

回答

4

两种解决方案浮现在脑海中:

  1. 使用一个数据库表中,对于两部分组成的字符串键和值字段。这是最具扩展性的解决方案,也是“最重的”解决方案。

  2. 创建一个简单的StringPair结构,它接受两个字符串(为您的应用程序提供类和成员有意义的名称),实现相等和哈希代码生成(可能只是异或来自两个字符串的哈希代码),然后使用在该StringPair上键入的简单字典。

+1

对于第二个选项'Tuple <字符串,字符串>'和字典键一样好。 – 2011-06-13 22:35:38

+0

@Rick,Tuple可以工作,但我会建议创建一个自定义类型,因为它允许您为键提供有意义的名称。 – 2011-06-14 00:58:26

+0

如果使用包装类型来实现一个友好的双参数索引器,如OP所暗示的那样,那么只有大约三行的实现代码将引用“Tuple”。 – 2011-06-14 01:16:05

1

如果您扩展DataTable并添加自己的功能来按字符串“索引”行,该怎么办?你可以使用方法(S)作为一个包装的东西,像DataTable.Select

1

下面的示例代码会做你想要什么:

public class InfoTable 
    { 
     Dictionary<string, int> _collection; 
     public InfoTable() 
     { 
      _collection = new Dictionary<string,int>(); 
     } 

     public int this[string col,string row] { 

      get 
      { 
       string colrow = col+"_"+row; 
       if (_collection.ContainsKey(colrow)) 
        return _collection[colrow]; 
       _collection.Add(colrow, 0); 
       return 0; 
      } 
      set 
      { 
       string colrow = col + "_" + row; 
       if (_collection.ContainsKey(colrow)) 
        _collection[colrow] = value; 
       else 
        _collection.Add(colrow, value); 
      } 
     } 
    } 

,这里是你如何使用它:

InfoTable it = new InfoTable(); 
it["mike", "friday"] = 1; 
it["mike", "friday"]++; 
int val = it["mike", "friday"]; 
+0

如果您不允许在输入字符串中输入“_”,这只会给出一个明确的键。否则,“some_bad”,“data”与“some”,“bad_data”相同。 – 2011-06-14 00:53:26