Как мы можем набрать приведение IEnumerable > objOld в IEnumerable > objNew? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть объект 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>>>>();

Пожалуйста, дайте мне знать возможные способы сделать это.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Вы должны использовать Select метод дважды для этого. Первый раз сопоставить каждый KeyValuePair новому, второй раз сопоставить внутренний IEnumerable<ClassA> с IEnumerable<ClassB>. Невозможно напрямую привести ClassA экземпляр к ClassB, потому что классы разные. Таким образом, вы должны создать ClassB экземпляр вручную на основе свойств каждого ClassA экземпляра

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
    })));
3 голосов
/ 07 апреля 2020

Только потому, что два класса имеют одинаковые члены, не подразумевает никакого отношения наследования. Вместо приведения один к другому вы должны создавать новые экземпляры B для каждого A.

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