我们如何将 IEnumerable<KeyValuePair<string, IEnumerable<ClassA>>> objOld 强制转换为 IEnumerable<KeyValuePair<string, IEnumerable<ClassB>>> objNew?

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;

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

请告诉我可能的方法。

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

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

你应该使用 Select 方法两次。第一次将每个 KeyValuePair 映射到新的,第二次将内部 IEnumerable<ClassA> 映射到 IEnumerable<ClassB>。 没有办法直接将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
    })));