Определите Дополнительный Метод для IEnumerable <T>, который возвращает IEnumerable <T>?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

26
задан GEOCHET 1 October 2014 в 13:28
поделиться

3 ответа

Самый легкий способ записать любой итератор с блоком итератора, например:

static IEnumerable<T> Where<T>(this IEnumerable<T> data, Func<T, bool> predicate)
{
    foreach(T value in data)
    {
        if(predicate(value)) yield return value;
    }
}

ключ здесь" yield return", который превращает метод в блок итератора с компилятором, генерирующим перечислитель (IEnumerator<T>), который делает то же. Когда названо, универсальный вывод типа обрабатывает T автоматически, таким образом, Вам просто нужно:

int[] data = {1,2,3,4,5};
var odd = data.Where(i=>i%2 != 0);

Вышеупомянутое может использоваться с анонимными типами очень хорошо.

, coure, можно определить T, если Вы хотите (как долго, поскольку это не анонимно):

var odd = data.Where<int>(i=>i%2 != 0);

Ре IEnumerable (неуниверсальный), ну, в общем, самый простой подход для вызывающей стороны для использования .Cast<T>(...) или .OfType<T>(...) для получения IEnumerable<T> сначала. Можно передать в [1 112] в вышеупомянутом, но вызывающая сторона должна будет определить T самостоятельно, вместо того, чтобы иметь компилятор выводят его. Вы не можете использовать это с [1 114] являющийся анонимным типом, таким образом, мораль здесь: не используйте неуниверсальную форму [1 115] с анонимными типами.

существуют некоторые немного более сложные сценарии, где сигнатура метода такова, что компилятор не может определить T (и конечно Вы не можете определить его для анонимных типов). В тех случаях обычно возможно осуществить рефакторинг в различную подпись, что компилятор может использование с выводом (возможно, через передачу - через метод), но необходимо было бы отправить фактический код для предоставления ответа здесь.

<час>

(обновил)

После обсуждения, вот способ усилить Cast<T> с анонимными типами. Ключ должен обеспечить аргумент, который может использоваться для вывода типа (даже если аргумент никогда не используется). Например:

static void Main()
{
    IEnumerable data = new[] { new { Foo = "abc" }, new { Foo = "def" }, new { Foo = "ghi" } };
    var typed = data.Cast(() => new { Foo = "never used" });
    foreach (var item in typed)
    {
        Console.WriteLine(item.Foo);
    }
}

// note that the template is not used, and we never need to pass one in...
public static IEnumerable<T> Cast<T>(this IEnumerable source, Func<T> template)
{
    return Enumerable.Cast<T>(source);
}
41
ответ дан Marc Gravell 28 November 2019 в 07:16
поделиться
using System;
using System.Collections.Generic;

namespace ExtentionTest {
    class Program {
        static void Main(string[] args) {

            List<int> BigList = new List<int>() { 1,2,3,4,5,11,12,13,14,15};
            IEnumerable<int> Smalllist = BigList.MyMethod();
            foreach (int v in Smalllist) {
                Console.WriteLine(v);
            }
        }

    }

    static class EnumExtentions {
        public static IEnumerable<T> MyMethod<T>(this IEnumerable<T> Container) {
            int Count = 1;
            foreach (T Element in Container) {
                if ((Count++ % 2) == 0)
                    yield return Element;
            }
        }
    }
}
4
ответ дан Howard Pinsley 28 November 2019 в 07:16
поделиться

Это сообщение может помочь Вам начать: , Как Вы пишете Дополнительный Метод C# для В общем Введенного Класса . Я не уверен, точно ли это, что Вы ищете, но это могло бы запустить Вас.

0
ответ дан Community 28 November 2019 в 07:16
поделиться