LINUX.ORG.RU

Это был риторический вопрос?
Сейчас вспомнить попытаюсь этот c#, сталкивался с таким.
В своей коллекции ручками перебери на IEnumerabe<T>, ибо List<List<T>> и IEnumerable<IEnumerabe<T>> это разные типы.
Если хочешь передать универсально то используй просто IEnumerabe.

zJes ★★
()
Ответ на: комментарий от yoghurt
//later
 var tmp = listDeleteRepeatsLists(alls);

        private static IEnumerable<IEnumerable<T>> listDeleteRepeatsLists<T>(
            IEnumerable<IEnumerable<T>> listsOnListConforms)
        {
            var result = new List<IEnumerable<T>>();
            foreach (var confList in listsOnListConforms)
            {
                var yetAddP = false;
                foreach (var yetAdd in result)
                {
                    if (equalElsInIEnumerablesP(confList, yetAdd))
                    {
                        yetAddP = true;
                        break;
                    }
                }
                if(!yetAddP)
                    result.Add(confList);
            }
            return result;
        }

        private static bool equalElsInIEnumerablesP<T>(IEnumerable<T> l1, IEnumerable<T> l2)
        {
            if (l1.Count() != l2.Count())
                return false;
            foreach (var el1 in l1)
            {
                if (!l2.Contains(el1))
                    return false;
            }
            return true;
        }

попробуй

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от zJes

ибо List<List<T>> и IEnumerable<IEnumerabe<T>> это разные типы.

и пох, что List реализует IEnumerable чтоли? отстой какой-то

просто IEnumerabe.

а если надо знать тип вложенных элементов?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

У меня окружения нет нужного под рукой =)

yoghurt ★★★★★
()
Ответ на: комментарий от pseudo-cat

> и пох, что List реализует IEnumerable чтоли

Из остаточных воспоминаний:
C# пох, пока не будет имплементовано имплицитное преобразование.
В твоем случае (коллекция в коллекции) оно будет нужно.

а если надо знать тип вложенных элементов?


Рефлекшн же. :)

zJes ★★
()
Ответ на: комментарий от zJes

нет, городить свою убогую диспетчеризацию по типам - убого

pseudo-cat ★★★
() автор топика

В C# 4 работает (поскольку там IEnumerable<out T>). Если не принципиально - может на него перейти? Благо моно уже почти год как умеет (пруф).

Sectoid очень правильную ссылку дал, кстати.

gizzka ★★
()

Хороший вопрос. Компилятор, похоже, не сравнивает что имплементируют параметры типа, а сравнивает только сами типы (т.е. не интересует его что имплементирует T в List<T>, он смотрит только на тип этого Т). А типы не совпадают (IEnumerable и List).

Функция с параметрами IEnumerable<IEnumerabe<T>> по идее должна без проблем принять параметр типа List<IEnumerable<T>>.

Другой вариант конкретно указать компилятору, что тип Т0 в IEnumerable<T0> должен имлементировать IEnumerable<T>. Это, похоже, можно сделать так:

    static class Test<T>
        {
        public static IEnumerable<T0> listDeleteRepeatsLists<T0> (IEnumerable<T0> listsOnListConforms)
            where T0 : IEnumerable<T>
            {
            //...
            }
        }

И пользоваться этим так:

Test<T>.listDeleteRepeatsLists (new List<List<T>> ());
smh ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.