【问题标题】:How to create object[][] from Hashtable dynamically?如何从 Hashtable 动态创建 object[][]?
【发布时间】:2018-09-27 08:33:33
【问题描述】:

我正在为第三方的 Web 服务编写一个包装器。界面如下:

public System.Data.DataSet GetXxxx(string functionName, object[][] parameters)

一些functionNames 不使用参数,其中一些使用一个,其中一些更多,就像这样(来自他们的文档):

parameters[0][0]: @key_one
parameters[0][1]: value for @key_one
parameters[1][0]: @key_two
parameters[1][1]: value for @key_two

为了概括包装器,我正在考虑传递HashtableDictionary<string, object>,并在包装​​器内动态创建parameters[][]

我该怎么做?

更新:实际上,参数对必须保持顺序。做,我必须将界面更改为:

using ListOfParamPairs = List<KeyValuePair<string, object>>;

...

public static DataSet GetXxxx(string functionName, ListOfParamPairs parameters)
{
    ...
}

【问题讨论】:

  • 如果我理解你的话;给var dictionary = parameters.ToDictionary(line =&gt; line[0].ToString(), line =&gt; line[1]);?返回:object[][] parameters = dictionary.Select(pair =&gt; new object[] {pair.Jey, pair.Value}).ToArray();
  • Dictionary&lt;K, V&gt; 没有有任何订单。如果参数的顺序很重要,是的,你必须切换到List&lt;KeyValue&lt;K, V&gt;&gt; 或类似的

标签: c# arrays dictionary


【解决方案1】:

如果我没听错的话,你可以试试Linq

object[][]Dictinary&lt;string, object&gt;

 using System.Linq;

 ...

 Dictionary<string, object> dictionary = parameters
 //.Where(line => line.Length == 2 && line[0] != null) // valid params only
   .ToDictionary(line => line[0].ToString(), 
                 line => line[1]);

返回object[][]:

 using System.Linq;

 ...

 object[][] parameters = dictionary
   .Select(pair => new object[] {pair.Key, pair.Value})
   .ToArray();

编辑:如果我们必须切换到List&lt;KeyValuePair&lt;String, Object&gt;&gt;(我们希望保留初始顺序;字典的对不按顺序排列):

收件人:

 List<<KeyValuePair<String, Object>> list = parameters
   //.Where(line => line.Length == 2 && line[0] != null) // valid params only  
   .Select(line => new KeyValuePair(line[0].ToString(), line[1]))
   .ToList();

返回:(技术上相同)

  object[][] parameters = list
    .Select(pair => new object[] {pair.Key, pair.Value})
    .ToArray();

【讨论】:

  • 谢谢德米特里。实际上,我必须保留参数的顺序。你能对更新发表评论吗?
  • @pepr:如果我们从Dictinary&lt;string, object&gt; 切换到List&lt;&lt;KeyValuePair&lt;String, Object&gt;&gt;,我们必须稍微修改To 部分(请参阅我的编辑)
  • 在您看来,List&lt;&lt;KeyValuePair&lt;String, Object&gt;&gt; 是最佳选择,还是您会选择其他方式? (我正在考虑在调用 warapper 时如何显式编写参数。)
  • @pepr:嗯,List&lt;KeyValue&lt;string, object&gt;&gt; 是一个不错的选择,前提是您没有很多(比如数千个)参数,您可以通过它们的名称来处理它们。可能的(但在我看来,更糟)替代方案是List&lt;Tuple&lt;string, object&gt;&gt;
猜你喜欢
  • 2018-02-17
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
相关资源
最近更新 更多