【问题标题】:C# matrix keyed by column and row string values由列和行字符串值键控的 C# 矩阵
【发布时间】:2011-06-13 22:10:32
【问题描述】:

我想创建一个具有可变列数和可变行数的 c# 数据结构。我会将值插入“单元格”。我希望能够使用字符串而不是整数来索引列和行,以便我可以按如下方式寻址这些单元格: infotable("pete","monday")=3 或 infotable("mike","星期五”)++。当我遇到尚不存在的列名或行名时,我会将其添加到结构中。

我曾考虑过使用嵌套集合,但我无法保证每个嵌套集合都包含与所有其他嵌套集合相同的键(除非我手动管理)。我曾考虑过使用 DataTables,但后来我无法使用字符串索引行。

满足我的要求的最佳方式是什么?

谢谢。

【问题讨论】:

    标签: c# arrays collections


    【解决方案1】:

    想到两个解决方案:

    1. 使用包含两部分字符串键和值字段的数据库表。这是最具扩展性的解决方案,但也是“最重”的解决方案。

    2. 1234563然后使用一个简单的字典,键入该 StringPair。

    【讨论】:

    • 第二个选项Tuple<string, string> 与字典键一样好用。
    • @Rick,Tuple 可以工作,但我建议创建一个自定义类型,因为它允许您为键赋予有意义的名称。
    • 如果使用实现友好的两参数索引器的包装器类型,正如 OP 所暗示的那样,那么只有大约三行实现代码将引用Tuple
    【解决方案2】:

    如果您扩展DataTable 并添加您自己的功能来按字符串“索引”行怎么办?您可以将方法用作 DataTable.Select

    之类的包装器

    【讨论】:

      【解决方案3】:

      以下示例代码将满足您的需求:

      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"];
      

      【讨论】:

      • 如果您不允许在输入字符串中使用“_”,这只会给出一个明确的键。否则 "some_bad","data" 与 "some","bad_data" 相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多