단일 값에서 새 IEnumerable <T> 시퀀스를 만드는 가장 좋은 방법은 무엇입니까?


97

일반적으로 다음과 같이 배열 구문을 사용하여 단일 값에서 시퀀스를 만듭니다.

IEnumerable<string> sequence = new string[] { "abc" };

또는 새 목록을 사용합니다. 누구든지 똑같은 일을 할 수있는 더 표현적인 방법이 있는지 듣고 싶습니다.


3
빈 시퀀스는 어떻습니까?
CoderDennis

dotnet에 여전히 Enumerable.From<T>(params T[] items).
Good Night Nerd Pride

답변:


144

귀하의 예제는 빈 시퀀스가 ​​아니라 요소가 하나 인 시퀀스입니다. 빈 문자열 시퀀스를 만들려면 다음을 수행하십시오.

var sequence = Enumerable.Empty<string>();

EDIT OP는 단일 값을 만들려고한다고 분명히했습니다. 그 경우

var sequence = Enumerable.Repeat("abc",1);

D' oh, 미안해. 빈 인스턴스를 만드는 것이 아니라 단일 값에서 만드는 것을 의미했습니다!
Marcel Lamothe

이것이 '답변'플래그입니까?
n8wrl 2009-06-19

이 방법은 새 배열을 만드는 것보다 순전히 기능적입니다.
Roy Tinker 2011 년

69

나는 당신이 제안한 것을 좋아하지만 배열 유형이 생략되었습니다.

var sequence = new[] { "abc" };

4
나는 당신이 그렇게 할 수 있다는 것을 결코 깨닫지 못했습니다. 나는 이것이 반복을 사용하는 것보다 더 명확하다고 생각합니다.
Marcel Lamothe

1
그러나 이것은 IEnumerable이 아니라 배열입니다!
Zodman 2013 년

4
@Bryan Watts 나는 그것을 알고 있지만 IEnumerable의 구체적인 구현입니다. 질문은 IEnumerable <>을 요청하는 것입니다 (예제가 아닌 경우에도). 차이가 있습니다.
Zodman

질문을 변경해야 할 수도 있습니다.
Zodman

1
@Jonesopolis : 그것은 다른, 무관 한 상황입니다. 그것을 Task.FromResult달성하기 위해 사용할 수 있습니다 .
Bryan Watts

21

또는 더 짧게,

string[] single = { "abc" };

확장 방법을 만들 것입니다.

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

또는 더 좋고 더 짧게

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

아마도 이것이 정확히 Enumerable.Repeat후드 아래에서하는 일입니다.


1
마지막은 훌륭합니다. 이름을 제외하고 ... 예제의 문자열과 같이 이미 IEnumerable을 구현하는 유형과 충돌합니다. .AsSingleItemEnumerable () 또는 간단히 .Yield ()-> "abc".Yield ()
DanO

7
ToEnumerable이 더 적절하다고 생각합니다.
Zodman

2
+1 Yield이 좋습니다. 나도 만들었다 IEnumerable<T> Yield<T>(this T source, params T[] others).
Jodrell 2014

나는 람다를 위해 Yield를 모두 없애려고했지만 어떻게 든 컴파일되지 않았습니다 ... cf. stackoverflow.com/questions/1217729/… ;-).
피터 - 분석 재개 모니카

@PeterSchneider 어떻게 그리고 왜 그렇게 했습니까? 코드를 보지 않고는 주석을 달 수 없습니다. 나는 당신을 따르는 것 같아요.
나팔

5

또는 그냥 방법을 만듭니다

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

또는

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

사용법 :

IEnumerable<string> items = CreateEnumerable("single");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.