2011-05-09 2 views
1

나는 IEnumerable (e)와 T (t)의 단일 값을 가지고 있다고 가정합니다.LINQ가있는 요소 삽입

IEnumerable<T> newCollection = t+e 

순간 내가 뭐하는 거지 :

ItemArray = Enumerable.Repeat<object>(t, 1).Concat(e); 

I'am 여기하지 진짜 반복을하고 있기 때문에, 오히려 읽을 수행하는 가장 간단한 방법은 무엇입니까. 나는 또한 시도 :

IEnumerable<T> newCollection = new List<object> { t}.Concat(e); 

그러나 이것 또한 최적이 아닌 불필요한 목록 개체를 만듭니다.

누구에게 더 좋은 아이디어가 있습니까?

답변

3

Jon Skeet의 답변은 가장 의미 상으로 중요합니다. 당신은 여전히 ​​인라인을 할 수있는 방법을하려는 경우, 당신은 암시 적 형식의 배열을 사용할 수 있습니다 대신 목록의

newCollection = new[] { t }.Concat(e); 
6

MoreLINQ에는 Prepend 방법이 있습니다. 그래서 코드는 다음과 같습니다

ItemArray = e.Prepend(t); 

편집 : 후드, Prepend는 현재 코드가 무엇을 수행 - 난 정말 그냥 Repeat/Concat 부분을 숨기는 방법으로 리팩토링을 제안하고있어, 당신 잎 더 읽기 쉬운 호출 코드.

+0

명백히 prepend 메소드는 두 번째 코드 스텁에서와 동일한 작업에 대한 래퍼 일뿐입니다. –

+1

@Yet Another Geek : 그래,하지만 그 이의 제기는 의미 론적 이라기보다는 가독성 *이라는 것에 주목하라. 그래도 편집 할 것입니다 ... –

2

, 좀 더 복잡한 객체, 그냥 간단한 배열을 만들어보십시오. 그것은 더 빠를 수 있습니다 :

IEnumerable<T> newCollection = new [] { t}.Concat(e); 

내가, 당신은 어떤 유형의 새 컬렉션을 만들어야합니다이 항목을 추가 할 Linq에를 사용하여, 지금 말씀 드리죠. 이것은 Linq가 열거 형과 함께 작동하도록 설계 되었기 때문에 그리고 부작용이 없기 때문입니다. Linq 문에서 수행하는 작업과 상관없이 원본 열거 형은 시작하기 전에 남아 있습니다 (단, 열거 형의 부작용이있는 사용자 지정 컬렉션을 다루는 경우는 제외). 결말은 어떤 수준에서 Linq가 단일 항목을 하나의 항목을 포함하는 모음으로 취급해야하므로 원하는 모든 출력을 생성하기 위해 해당 모음을 열거 할 수 있습니다. 이것은 MoreLINQ와 같은 확장 메소드 뒤에 구현을 숨길 지 여부와 상관없이 사실입니다.

관련 문제