단일 항목을 IEnumerable <T>로 전달 {

매개 변수 T를 예상하는 메소드에 단일 유형의 항목을 전달하는 일반적인 방법이 IEnumerable<T>있습니까? 언어는 C #, 프레임 워크 버전 2.0입니다.

현재 도우미 메서드를 사용하고 있습니다 (.Net 2.0이므로 LINQ와 비슷한 캐스팅 / 프로젝션 도우미 메서드가 많이 있습니다). 그러나 이것은 어리석은 것처럼 보입니다.

public static class IEnumerableExt
{
    // usage: IEnumerableExt.FromSingleItem(someObject);
    public static IEnumerable<T> FromSingleItem<T>(T item)
    {
        yield return item; 
    }
}

다른 방법은 물론 만들고 채우는 것 List<T>또는를 Array하고 대신 전달할 IEnumerable<T>.

[편집] 확장 방법으로 이름을 지정할 수 있습니다 :

public static class IEnumerableExt
{
    // usage: someObject.SingleItemAsEnumerable();
    public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
    {
        yield return item; 
    }
}

여기에 뭔가 빠졌습니까?

[Edit2] 우리는 someObject.Yield()(아래 주석에서 @Peter가 제안한 바와 같이)이 확장 방법에 가장 적합한 이름, 주로 간결성을 위해 다음과 같은 것을 발견했습니다.

public static class IEnumerableExt
{
    /// <summary>
    /// Wraps this object instance into an IEnumerable&lt;T&gt;
    /// consisting of a single item.
    /// </summary>
    /// <typeparam name="T"> Type of the object. </typeparam>
    /// <param name="item"> The instance that will be wrapped. </param>
    /// <returns> An IEnumerable&lt;T&gt; consisting of a single item. </returns>
    public static IEnumerable<T> Yield<T>(this T item)
    {
        yield return item;
    }
}


답변

도우미 방법은 IMO를 수행하는 가장 깨끗한 방법입니다. 목록이나 배열을 전달하면 부주의 한 코드 조각이이를 캐스팅하여 내용을 변경하여 일부 상황에서 이상한 동작을 일으킬 수 있습니다. 읽기 전용 컬렉션을 사용할 수 있지만 더 많은 줄 바꿈이 필요할 수 있습니다. 귀하의 솔루션은 최대한 깔끔하다고 생각합니다.


답변

글쎄, 메소드 IEnumerable가 하나의 요소 만 포함하더라도 목록 인 것을 전달해야한다고 기대 한다면.

통과

new[] { item }

논쟁이 충분해야한다고 생각합니다


답변

C # 3.0에서는 System.Linq.Enumerable 클래스를 활용할 수 있습니다.

// using System.Linq

Enumerable.Repeat(item, 1);

그러면 아이템 만 포함하는 새로운 IEnumerable이 생성됩니다.


답변

C # 3 (2라고 말했듯이)에서 구문을 좀 더 수용 할 수있는 일반적인 확장 방법을 작성할 수 있습니다.

static class IEnumerableExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this T item)
    {
        yield return item;
    }
}

클라이언트 코드는 item.ToEnumerable()입니다.


답변

이 헬퍼 메소드는 항목 또는 다수에 적용됩니다.

public static IEnumerable<T> ToEnumerable<T>(params T[] items)
{
    return items;
}    

답변

클라이언트 API를 단순화하기 위해 T 유형의 인수로 메소드의 새로운 과부하를 제안한 사람이 아무도 없습니다.

public void DoSomething<T>(IEnumerable<T> list)
{
    // Do Something
}

public void DoSomething<T>(T item)
{
    DoSomething(new T[] { item });
}

이제 클라이언트 코드는 다음과 같이 할 수 있습니다.

MyItem item = new MyItem();
Obj.DoSomething(item);

또는 목록 :

List<MyItem> itemList = new List<MyItem>();
Obj.DoSomething(itemList);

답변

(이전에 말했듯이)

MyMethodThatExpectsAnIEnumerable(new[] { myObject });

또는

MyMethodThatExpectsAnIEnumerable(Enumerable.Repeat(myObject, 1));

참고로, 익명 객체의 빈 목록을 원할 경우 마지막 버전도 좋습니다.

var x = MyMethodThatExpectsAnIEnumerable(Enumerable.Repeat(new { a = 0, b = "x" }, 0));