매개 변수 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<T>
/// 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<T> 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));