簡體   English   中英

C#如何基於LINQ查詢中的字符串數組聲明新的Dictionary對象

[英]C# How to declare new Dictionary object based off a string array within a LINQ query

我有一些這樣的代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

class Program
{
    static void Main(string[] args)
    {
        string xml = @"<Root>
  <Report1>
    <Row>
      <Field1>data1-1</Field1>
      <Field2>data1-2</Field2>
      <!-- many more fields -->
    </Row>
    <Row>
      <Field1>data2-1</Field1>
      <Field2>data2-2</Field2>
      <!-- many more fields -->
    </Row>
  </Report1>
</Root>";

        XDocument doc = XDocument.Parse(xml);

        var report1 = from report in doc.Root.Elements("Report1").Elements("Row")
                      select new Dictionary<string, string>()
                          {
                              {"Field1", report.Elements("Field1").First().Value},
                              {"Field2", report.Elements("Field2").First().Value}
                          };

        var i = 1;
        foreach (Dictionary<string, string> dict in report1)
        {
            Console.WriteLine(String.Format("Row{0}: ", i));
            Console.WriteLine("  Field1: {0}", dict["Field1"]);
            Console.WriteLine("  Field2: {0}", dict["Field2"]);
            i++;
        }

        Console.ReadLine();
    }
}

可以定義一個可用於聲明這些字典對象的字符串數組或其他數據結構嗎? 這是一些愚蠢的偽代碼,可以幫助說明我的想法:

編輯下面的偽代碼中的變量fieldNames將是我期望的名稱數組,而不是基於xml源字段名稱。 我將忽略xml源中未在fieldNames數組中顯式設置的任何字段名稱。

var report1 = from report in doc.Root.Elements("Report1").Elements("Row")
              select new Dictionary<string, string>()
           {
              foreach (var fieldName in fieldNames)
              {
                  {fieldName, report.Elements(fieldName).First().Value}
              }
           };

使用Enumerable.ToDictionary

var report1 = 
    from report in doc.Root.Elements("Report1").Elements("Row")
    select new[] {"Field1", "Field2", "Field3"}
        .ToDictionary(x => x, x => report.Elements(x).First().Value)

偽代碼實際上非常接近您的實際能力。 我假設您已經准備好了一個單獨的fieldNames集合。

IEnumerable<string> fieldNames = ...;
XDocument doc = ...;
var report1 = doc.Root.Elements("Report1").Elements("Row")
    .Select(report =>
    {
        var d = new Dictionary<string, string>();
        foreach (var fieldName in fieldNames)
        {
            d.Add(fieldName, report.Elements(fieldName).First().Value);
        }
        return d;
    });

不要嘗試在單個集合初始化程序中完成所有操作。

對於這樣的事情,我將創建一個單獨的方法:

public static Dictionary<string, string> MapReport(XElement report)
{
    var output = new Dictionary<string, string>();
    foreach(var field in report.Elements())
    {
        output.Add(field.Name, ...);
    }
}

然后查詢將變得更簡單:

var report1 = from report in doc.Root.Elements("Report1").Elements("Row")
              select MapReport(report)

這將為您提供List<Dictionary<string,string>>類型的List<Dictionary<string,string>>

var rows = doc.Descendants("Row")
           .Select(r => r.Elements()
                         .ToDictionary(x => x.Name.LocalName, x => x.Value))
           .ToList();

..

var data = rows[i]["Field1"];

暫無
暫無

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

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