在字典中使用Lambda表达式

本文关键字:Lambda 表达式 字典 | 更新日期: 2023-09-27 17:57:29

我尝试从DB中获取数据并插入字典

数据如:(数据库中的列)电子邮件。电子邮件和有(数据库中列)错误消息无效的电子邮件

(数据库中的列)Email.Required(数据库中列)错误消息此字段是必需的

我想创建看起来像的字典

Dictionary<string , Dictionary<string,string>>

结果是:

<Email, <Email, Invalid email>
<Email, < Required, This field is required>

我开始做:

 Email = new Dictionary<string, Dictionary<string, string>>()
            {
                {
                   data.Where(k => k.Key.Contains("Email."))
                       .Select( k => k.Key.Split(new string[] { "." }, StringSplitOptions.None)[0])
                       .FirstOrDefault(),new Dictionary<string, string>()
                   {
                       {
                         data.Where(k => k.Key.Contains("Email."))
                          .Select( k => k.Key.Split(new string[] { "." }, StringSplitOptions.None)[1])
                          .FirstOrDefault(),
                          "VALUE"
                       }
                   }
                }
            }

我得到的结果看起来像

<Email,<Required,value>>

但我没有成功参加

 <Email,<Email,value>> 

编辑:

数据看起来像:

价值数据

我没有得到例外,因为我只有一个"电子邮件",这个键我有字典,我存储值

*我的解决方案*

    Email = new Dictionary<string, Dictionary<string, string>>()
            {
                {
                   _dataFromDB.Where(k => k.Key.Contains("Email.")).Select( k => k.Key.Split(new string[] { "." }, StringSplitOptions.None)[0]).FirstOrDefault(),
                   _dataFromDB.Where(k=> k.Key.Contains("Email.")).ToDictionary( k => split(k.Key) , va => va.Value )
                }
            }

    private string split(String key)
    {
        string[] values = key.Split(new string[] { "." },   StringSplitOptions.None);
        return values[1];
    }

解决方案

在字典中使用Lambda表达式

你不能有这个

结果是:

<Email, <Email, Invalid email>
<Email, < Required, This field is required>

由于字典只允许使用唯一密钥

你能做的是:

List<KeyValuePair<string , Dictionary<string,string>>

然后使用在列表中添加您想要的内容

list.Add(new KeyValuePair<string,Dictionary<string,string>>("Email", dictionary here));

根据您所写的内容,您的数据看起来像可以由以下数组表示的内容:

var data = new [] {
    new { Col1 = "Email.Email",  Col2 = "Invalid email" },
    new { Col1 = "Email.Required", Col2 = "This field is required" },
};

您需要使用group by来获取需要在"内部"目录中的所有行。

要获得您想要的结构,您可以使用以下代码

var results = (
    from row in data.Select(x => new { Key1 = x.Col1.Split('.')[0], Key2 = x.Col1.Split('.')[1], Col2 = x.Col2 })
    group row by row.Key1 into g
    select new { Key = g.Key, Value = g.ToDictionary(k => k.Key2, v => v.Col2) }
)
.ToDictionary(x=>x.Key, x=>x.Value);