【问题标题】:How can we type cast IEnumerable<KeyValuePair<string, IEnumerable<ClassA>>> objOld into IEnumerable<KeyValuePair<string, IEnumerable<ClassB>>> objNew?我们如何将 IEnumerable<KeyValuePair<string, IEnumerable<ClassA>>> objOld 类型转换为 IEnumerable<KeyValuePair<string, IEnumerable<ClassB>>> objNew?
【发布时间】:2020-04-07 09:39:58
【问题描述】:

我有一个对象IEnumerable&lt;KeyValuePair&lt;string, IEnumerable&lt;ClassA&gt;&gt;&gt; objOld;,我想将其转换为IEnumerable&lt;KeyValuePair&lt;string, IEnumerable&lt;ClassB&gt;&gt;&gt; objNew;

ClassA 和 ClassB 都有相同的对象

public class ClassA
{ `public string str1 { get; set; }
    public string str2 { get; set; } 
    public int newNum { get; set; } `
}

public class ClassB
{ `public string str1 { get; set; }
    public string str2 { get; set; } 
    public int newNum { get; set; } `
}

我尝试了以下操作,但它正在生成异常。

objNew = objOld.Cast<IEnumerable<KeyValuePair<string, IEnumerable<ClassB>>>>();

请告诉我可能的方法。

【问题讨论】:

    标签: c# .net ienumerable


    【解决方案1】:

    您应该为此使用两次Select 方法。第一次将每个KeyValuePair 映射到新的,第二次将内部IEnumerable&lt;ClassA&gt; 映射到IEnumerable&lt;ClassB&gt;。 没有办法直接将ClassA 实例转换为ClassB,因为类不同。因此,您应该根据每个 ClassA 实例的属性手动创建 ClassB 实例

    IEnumerable<KeyValuePair<string, IEnumerable<ClassB>>> objNew = objOld.Select(o =>
        new KeyValuePair<string, IEnumerable<ClassB>>(o.Key, o.Value.Select(a => new ClassB
        {
            str1 = a.str1,
            str2 = a.str2,
            newNum = a.newNum
        })));
    

    【讨论】:

      【解决方案2】:

      仅仅因为两个类具有相同的成员并不意味着任何继承关系。您应该为每个A 创建B 的新实例,而不是casting

      var result = myInput.ToDictionary(x => x.Key, x => x.Select(y => new ClassB { 
              str1 = y.str1, 
              str2 = y.str2, 
              newNum = y.newNum 
          })
      );
      

      或者如果你真的想要KeyValuePair的列表:

      var result = myInput.Select(x => 
          new KeyValuePair<string, IEnumerable<ClassB>>(x.Key, x => x.Select(y => new ClassB { 
              str1 = y.str1, 
              str2 = y.str2, 
              newNum = y.newNum 
          })
      ));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多