2010-07-06 3 views
1

확장 메서드를 사용하여 IEnumerable 컬렉션에 항목을 추가하는 가장 좋은 방법은 무엇입니까?C# IEnumerable에 AddItem의 확장 메서드 <T>

+0

IEnumerable에 요소를 추가 할 수 없습니다. 가장 좋은 것은 하나의 요소로 새 IEnumerable을 만드는 것입니다. – Andrey

+0

예, 알고 있습니다. 그래서 내가 무엇이 최선의 방법인지 묻습니다. – mynkow

답변

10
enumerable.Concat(new[]{ objToAdd }) 
+0

실제로 이것은 새로운 열거 형을 생성하고 기존 하나를 추가하지 않습니다. – Andrey

+1

그래,하지만'IEnumerable '** 인터페이스 ** 자체는 읽기 전용이므로 그게 유일한 방법입니다. 기본 컬렉션에 추가하는 것이 항상 옵션이되는 것은 아닙니다 (예 : 기본 컬렉션이 실제로 존재하지 않는 경우). –

+0

'Andrey'가 논평 한 것을 강조하기 위해서 : ** 정확히 ** ** AddItem 메소드를 구현하지 않습니다 (예를 들어,'item'을'IEnumerable'에 추가하십시오). 그러한 메소드의 더 적합한 이름은'Concat (item)'입니다. 메소드가 새로운 IEnumerable을 리턴 할 것으로 기대합니다. –

0

나는 확실하지, 내 IEnumerableExtensions 클래스는 너무 효율적이있다, 그러나 나는 매우 아껴서 사용합니다.

public static IEnumerable<T> Add<T>(this IEnumerable<T> enumerable, T item) 
{ 
    var list = enumerable.ToList(); 
    list.Add(item); 
    return list; 
} 
+0

이 좋지 않으면 추가 메모리가 할당됩니다. Mehrdad Afshari의 답변이 정말 좋습니다. – Andrey

+0

전적으로 동의합니다. 이것이 내 exytensions 라이브러리에서 주로 사용되지 않고 사용되지 않는 이유입니다. – Jamiec

1

당신 수 없습니다 (직접). 인터페이스의 목적은 열거자를 노출하는 것입니다.

편집 : 당신은하지 기존 IEnumerable에 추가하는 대신 새로운 IEnumerable에 합치 될 것이다, 추가 할 또 다른 (A List 같은) 유형 또는 연결에 IEnumerable을 변환해야합니다.

유일한 옵션은 IList, ICollection, IDictionary, ILookup 등과 같이 추가 할 수있는 인터페이스를 구현하는지 테스트하는 것입니다. 그런 다음에도 테스트에 추가 할 수 있는지 확실하지 않습니다. 기존 IEnumerable.

+0

그리고 추가 할 수있는 enumerable (pun가 의도 한) 클래스에 의해 구현됩니다. – Jamiec

+0

IEnumerable 구현을 추가 할 필요는 없습니다. 그렇다면'IEnumerable.Add'가 존재할 것입니다. 의견은 절대적으로 정확합니다. –