Каков самый легкий и самый компактный способ создать IEnumerable <T> или ICollection <T>?

Я ожидаю, что стрелки покажут текущее состояние (подчеркивающий, когда список в настоящее время возрастет). Что Windows Explorer делает в Представлении Деталей.

9
задан Ashley Simpson 26 September 2009 в 14:58
поделиться

5 ответов

The current version of C# (3) supports a notation without explicit type, i.e.

Foo(new [] { o1, o2, o3 })

to create an array. There’s also Linq’s Enumerable.Range to create a continuous range of numbers. Everything else has to be implemented. In the spirit of Java:

public static IEnumerable<T> AsList<T>(params T[] values) {
    return values;
}

to be called like this:

Foo(Enumerable.AsList(o1, o2, o3));
11
ответ дан 4 December 2019 в 11:42
поделиться

Иногда я использовал метод с аргументом params.

Foo(params T[] ts)

И если я полностью настроен на IEnumerable, у меня просто делегат этого метода тому, кому нужен IEnumerable.

Foo(params T[] ts) { Foo(ts.AsEnumerable()); }

Вы должны вызвать AsEnumerable, иначе вы собираетесь выполнять рекурсию.

3
ответ дан 4 December 2019 в 11:42
поделиться

Assuming Foo expects an IEnumerable, you can take advantage of type inference and do:

T o1, o2, o3;
Foo(new []{o1, o2, o3});
2
ответ дан 4 December 2019 в 11:42
поделиться

Creating an array and passing that is probably the simplest/most elegant way to accomplish this in the current version of C#. You can take advantage of implicit array typing (i.e. new[] { ... }, but that's as far as it goes.

I suspect you're really looking for the C# equivalent of this F# syntax:

let foo = seq [ o1; o2; o3 ]

which generates an IEnumerable that will iterate over the specified elements. ('Seq' is actually the F# alias for 'IEnumerable`, though F# has built-in support for them.)

Unfortunately, since this is a largely functional notion, there is no C# equivalent - though who knows when it will be added, as C# becomes more and more functional.

2
ответ дан 4 December 2019 в 11:42
поделиться

Если у вас есть метод, который принимает массив в качестве последнего параметра, имеет смысл отметить этот параметр params . Это позволяет вызывать метод следующим образом:

Foo(o1, o2, o3);

Я нахожу это особенно полезным при написании модульного теста для Foo () , потому что часто в модульном тесте мои параметры разделяются таким образом, а не в array.

Я не рекомендую делать это, если есть перегрузка Foo () , которая не принимает массив в этой позиции, потому что это может быстро запутать.

Я действительно желаю этого язык C # разрешает params для IList :

void Foo(params IList<T> ts) { ... }
0
ответ дан 4 December 2019 в 11:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: