【问题标题】:'Convert' Dictionary<string,int> into List<object>'转换' Dictionary<string,int> 成 List<object>
【发布时间】:2017-06-22 07:48:47
【问题描述】:

我有一个Dictionary&lt;string,int&gt; dictionary1,我需要将其转换为List&lt;Data&gt;,其中Data 具有属性lable = dictionary1.key 和value = dictionary1.value。我不想使用 for/foreach 循环(由我自己编写),因为为了避免它,我正在尝试使用字典。

另一种选择是使用两个不同的字典(字典 2 和字典 3),其中 dictionary2&lt;string,keyOfDictionary1&gt;dictionary3&lt;string,valueOfDictionary1&gt;

我说得有道理吗?那可能吗?有更好的选择吗?

【问题讨论】:

  • “不想使用循环”会很困难。您将以某种方式迭代字典。
  • 你得到了很多 LINQ 的答案 - 请注意 LINQ 库本质上仍然运行 foreach 以返回结果。
  • 所有(当前)答案都包含关键成分 - 选择转换。这 对字典执行迭代,但是您在没有“循环”的情况下执行此操作。同意 Tim Schmelter 的观点,我怀疑您只是不想要 for/foreach 的语法丑陋?
  • "不想使用循环" :O ?这不可能。 AFAIK 甚至所有 LINQ 扩展方法都在幕后使用“循环”(优化)。
  • 这就是编辑按钮的用途,没什么可遗憾的。 =)

标签: c# .net linq


【解决方案1】:

假设:

class Data
{
    public string Label { get; set; }

    public int Value { get; set; }
}

然后:

Dictionary<string, int> dic;
List<Data> list = dic.Select(p => new Data { Label = p.Key, Value = p.Value }).ToList();

【讨论】:

  • 需要注意的是,如果你使用的是结构体,那就是yourDictionary.Select(p =&gt; new YourStruct(p.Key, p.Value )).ToList();
【解决方案2】:

也许你可以使用 LINQ?

dictionary1.Select(p => new Data(p.Key, p.Value)).ToList()

然而,这是使用 yield 并因此在后台循环...

【讨论】:

  • 这将要求Data 有一个将值作为参数的构造函数,问题中未指定。
  • @ErenErsönmez 是的,但是如果他需要的话,让它内联初始化是一件小事。我指出的是一种技术,而不是一种可复制粘贴的解决方案!
  • 由于不可变性,这是初始化结构所必需的。
【解决方案3】:
myDictionary.Select(x => new Data(){ label = x.Key, value = x.Value).ToList();

【讨论】:

    【解决方案4】:

    我假设“无循环”实际上意味着“我想要 LINQ”:

    List<Data> = dictionary1.Select(
        pair => new Data() {
            label = pair.Key,
            value = pair.Value
        })).ToList();
    

    【讨论】:

      【解决方案5】:

      试试

      dictionary1.Select(p => new Data(p.Key, p.Value)).ToList();
      

      【讨论】:

        【解决方案6】:

        .NET 已经有一个数据类型可以做Data 会做的事情:KeyValuePair&lt;T1,T2&gt;。 Dictionary 已经实现了IEnumerable&lt;KeyValuePair&lt;T1,T2&gt;&gt;,只需转换即可。

        Dictionary<string, int> blah = new Dictionary<string, int>();
        IEnumerable<KeyValuePair<string, int>> foo = blah;
        

        【讨论】:

        • 非常简单。如果不了解 OP 的需求,我们无法知道它是否真的不需要比这更复杂。 :)
        • 我同意如果Key 绝对 必须重命名Label 将无法满足需求。但这是避免循环 AFAIK 的唯一方法。然而,即使是演员阵容也毫无意义。 OP 可以在需要 IEnumerable 的任何地方使用字典。
        • 不幸的是,我需要将我的数据重命名为 Label。我试过这样做,但我会和你说的一样。所以,非常感谢你的帮助,很抱歉我没有明确地说我不想自己写一个 for/foreach 循环,因为我知道内置函数会更好地为我做这件事。方式(即使需要在后台循环)。
        【解决方案7】:

        这是一个旧帖子,但只是为了帮助其他人;)

        转换任何对象类型的示例:

        public List<T> Select<T>(string filterParam)
        {    
            DataTable dataTable = new DataTable()
        
            //{... implement filter to fill dataTable }
        
            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row;
        
            foreach (DataRow dr in dataTable.Rows)
            {
                row = new Dictionary<string, object>();
                foreach (DataColumn col in dataTable.Columns)
                {
                    row.Add(col.ColumnName, dr[col]);
                }
                rows.Add(row);
            }
        
            string json = new JavaScriptSerializer().Serialize(rows);
        
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T[]));
                var tick = (T[])deserializer.ReadObject(stream);
                return tick.ToList();
            }
        }
        

        【讨论】:

          【解决方案8】:
              public class Data
              {
                  public string Key { get; set; }
          
                  public int Value { get; set; }
              }
          
              private static void Main(string[] args)
              {
                  Dictionary<string, int> dictionary1 = new Dictionary<string, int>();
                  dictionary1.Add("key1", 1);
                  dictionary1.Add("key2", 2);
          
                  List<Data> data = dictionary1.Select(z => new Data { Key = z.Key, Value = z.Value }).ToList();
          
                  Console.ReadLine();
              }
          

          【讨论】:

            【解决方案9】:

            以防万一只是帮助任何人,我这样做了 - 将处理比单一值类型更复杂的对象,如 OP 所述。

            // Assumes: Dictionary<string, MyObject> MyDictionary;
            List<MyObject> list = new List<MyObject>();
            list.AddRange(MyDictionary.Values.ToArray());
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-01-25
              • 1970-01-01
              • 1970-01-01
              • 2012-11-22
              • 1970-01-01
              • 2021-10-04
              • 2017-09-20
              • 1970-01-01
              相关资源
              最近更新 更多