В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Самый легкий способ записать любой итератор с блоком итератора, например:
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);
}
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;
}
}
}
}
Это сообщение может помочь Вам начать: , Как Вы пишете Дополнительный Метод C# для В общем Введенного Класса . Я не уверен, точно ли это, что Вы ищете, но это могло бы запустить Вас.