Как я могу сделать расширение для списка списков - PullRequest
1 голос
/ 01 февраля 2020

Я хочу сделать расширение для списка списков, если это возможно. Я пробовал варианты этой темы, но ни одна не работала:

public static List<List<myClass>> ToListsOfmyClass(this IEnumerable<IEnumerable<OtherClass>> listsOfOtherClass)
{
    return listsOfOtherClass.SelectMany(many => many.Select(p => new myClass(p)).ToList()).ToList();
}

Я получаю следующую ошибку компиляции:

Ошибка CS0029 Не удается неявно преобразовать тип 'System.Collections.Generi c .List 'в' System.Collections.Generi c .List> 'SSX.Revit.Access D: \ SourceCode \ WorkSpaces \ AllProjects \ SSX.Revit \ r2020 (v.20) \ Запуск (плагин) \ v1.0 \ SSX.Revit.Access \ Support \ AIMPoint.cs 67 Активно

1 Ответ

3 голосов
/ 01 февраля 2020

Обратите внимание, что myClass (p) работает нормально, так как я использую его в другом месте.

Этот факт совершенно не имеет отношения к реальной проблеме, сообщение об ошибке должно быть таким:

Cannot implicitly convert type 'System.Collections.Generic.List<T>' to 'System.Collections.Generic.List<System.Collections.Generic.List<T>>'

Как мы уже говорили в комментариях, вы можете изменить свой метод так, чтобы он возвращал List<List<T>>:

public static List<List<myClass>> ToListsOfmyClass(this IEnumerable<IEnumerable<OtherClass>> listsOfOtherClass)
{
    return listsOfOtherClass.Select(x => x.Select(p => new myClass(p)).ToList()).ToList();
}

, или добавить другой метод, где мы сгладим коллекцию и вернем List<T>:

public static List<myClass> ToFlattenedListsOfmyClass(this IEnumerable<IEnumerable<OtherClass>> listsOfOtherClass)
{
   return listsOfOtherClass.SelectMany(x => new myClass(p)).ToList();
}

Кроме того, по количеству сценариев ios, где, например, у нас есть 1000 таких классов, я бы подумал о добавлении обобщенного метода c или использовании инструмента, подобного AutoMapper. Например:

public static List<List<To>> ToListsOfmyClass<From>(this IEnumerable<IEnumerable<From>> listsOfOtherClass) where From : IMyConvertible
{
   return listsOfOtherClass.Select(x => x.Select(p => p.Convert<To>()).ToList()).ToList();
}

interface IMyConvertible { ... }

Для реализации метода .Convert из интерфейса IMyConvertible

потребуется From
...