簡體   English   中英

在字典中使用Lambda表達式

[英]Using Lambda expressions with Dictionaries

我嘗試從數據庫獲取數據並插入字典

數據如:(來自DB的列)Email.Email並有(來自DB的列)錯誤消息無效的電子郵件

(來自DB的列)Email.Required(來自DB的列)錯誤消息此字段為必填

我想創建字典看起來像

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

你不能有這個

結果是:

<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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM