2010-08-20 2 views
24

두 시퀀스가 ​​있고 두 시퀀스를 모두 처리하려면 해당 시퀀스를 결합 할 수 있습니다.하나의 항목을 '연합'하기 위해 더 복잡한 linq 방법이 있습니까?

이제 두 개의 sequenc 사이에서 처리하려는 항목이 하나 있다고 가정 해 보겠습니다. 단일 항목을 사용하여 배열을 만들면 얻을 수 있지만 더 좋은 방법이 있습니까? 즉

var top = new string[] { "Crusty bread", "Mayonnaise" }; 
string filling = "BTL"; 
var bottom = new string[] { "Mayonnaise", "Crusty bread" }; 

// Will not compile, filling is a string, therefore is not Enumerable 
//var sandwich = top.Union(filling).Union(bottom); 

// Compiles and works, but feels grungy (looks like it might be smelly) 
var sandwich = top.Union(new string[]{filling}).Union(bottom); 

foreach (var item in sandwich) 
    Process(item); 

이 일의 승인 방법이, 또는이 승인 된 방법이 있나요?

+1

을 .. 행복 느낄 수 있지만, 암시 적 변환을 작성하는 방법이 경우는 ... 원더 주위 노력의 가치가 있었다 생각하지 않습니다 T와 T 배열 사이에 .. –

+0

[가능한 단일 값에서 새 IEnumerable 시퀀스를 만드는 즐겨 찾는 방법?] (http://stackoverflow.com/questions/1019737/favorite-way-to-create-an- new-ienumerablet-sequence-from-one-value) – nawfal

+1

새로운 문자열 []을 new []로 줄임으로써 노동 조합 표현을 단순화 할 수 있습니다. 그렇지 않으면 Jon Hanna의 솔루션이 이런 종류의 일을 자주 끝내면이 문제를 해결하는 가장 좋은 방법 일 것입니다. –

답변

32

하나의 옵션이 스스로를 오버로드하는 것입니다

감사합니다 : 우리가 MoreLINQConcat와 무슨 짓을했는지

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, T item) 
{ 
    return source.Union(Enumerable.Repeat(item, 1)); 
} 

. 이 col.Union(obj)col.Union(obj.EmitFromEnum());를 호출로 깔끔한 아니지만

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

가이 하나의 확장 방법은 내가 같은 단일 할 수 있습니다 다른 모든 경우를 포함한다는 것을 의미 않습니다

+1

열거 형. 반복, 감사합니다. 나는 정말로 그 과부하를 사용할지도 모른다. –

+1

여분의 괴상함을 위해 과부하 이름을'cons'라고 부릅니다. D –

+2

C# 코드를 작성할 때마다 F #이나 LISP와 같은 언어의 집합 운영 연산자를 간절히 생각합니다. 'list :: item' 또는'list1 @ list2'와 같은 구문은 익숙해지면 꽤 읽기 쉽습니다. – LBushkin

1

는 나는 어딘가에 내 코드에서 다음하는 경향이 - 항목 열거.

+1

'public static IEnumerable EmitFromEnum (이 T 항목) { 수익 항복 아이템; }' –

+0

@KuganKumar 그래. 감사. –

5

하는 것은 훨씬 더 유연한 접근 방식을 사용하는 것이 좋습니다 : 단일뿐만 아니라 여러 항목에 대한

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items) 
{ 
    return source.Union((IEnumerable<T>)items); 
} 

작품. 당신도 null source 값을 수용 할 수있다 : 이것은 내가 할 경향이 어떻게

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items) 
{ 
    return source != null ? source.Union((IEnumerable<T>)items) : items; 
} 
관련 문제