首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将散列表转换为字典

将散列表转换为字典
EN

Stack Overflow用户
提问于 2017-11-26 19:32:45
回答 2查看 5.1K关注 0票数 4

我想从c# specflow表创建一个字典。我需要这样做,因为标签中的值和值对于每个特性file.In (我当前的功能文件)都会发生变化,我有2列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
And I submit with following 
| Label         | Value               |
| Namelabel     | texttoenter123      |
| Email         |test@test.com        |

对应的Step.Tried使用linq。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [When(@"I submit with following ")]

   public void WhenISubmitWithFollowing(Table table)
        {
       //Should be something like this , which convert the table todictionary object
          var x = table.Rows.ToDictionary(k=>k.Keys,k=>k.Values);
        }``

目前,我正在this.Please帮助中获得null。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-27 17:07:30

如果您想灵活处理表列标题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var x = table.Rows.ToDictionary(r => r[0], r => r[1]);

否则:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var x = table.Rows.ToDictionary(r => r["Label"], r => r["Value"]);

如果您想要TechTalk.SpecFlow.Table的快速扩展方法,则为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static class SpecFlowExtensions
{
    /// <summary>
    /// Converts a two column Gherkin data table to a dictionary
    /// </summary>
    /// <param name="table"></param>
    /// <returns></returns>
    public static Dictionary<string, string> ToDictionary(this Table table)
    {
        if (table == null)
            throw new ArgumentNullException(nameof(table));

        if (table.Rows.Count == 0)
            throw new InvalidOperationException("Gherkin data table has no rows");

        if (table.Rows.First().Count != 2)
            throw new InvalidOperationException($@"Gherkin data table must have exactly 2 columns. Columns found: ""{string.Join(@""", """, table.Rows.First().Keys)}""");

        return table.Rows.ToDictionary(row => row[0], row => row[1]);
    }
}

并使用扩展方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var data = table.ToDictionary();
票数 6
EN

Stack Overflow用户

发布于 2017-11-26 22:11:25

如果每个键只有一个值,请尝试以下操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            DataTable dt = new DataTable();
            dt.Columns.Add("Label", typeof(string));
            dt.Columns.Add("Value", typeof(string));


            dt.Rows.Add(new object[] { "Namelabel", "texttoenter123" });
            dt.Rows.Add(new object[] { "Email", "test@test.com" });

            Dictionary<string, string> dict = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("Label"), y => y.Field<string>("Value"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

如果每个键有多个值,则使用以下方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            Dictionary<string, List<string>> dict = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("Label"), y => y.Field<string>("Value"))
                .ToDictionary(x => x.Key, y => y.ToList());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47503580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文