2011-12-31 4 views
2

관심있는 두 속성이있는 기존 개체 모음이 있습니다. 두 속성은 모두 같은 유형입니다. 속성 값으로 구성된 새로운 시퀀스를 만들고 싶습니다.여러 속성 값으로 구성된 시퀀스 만들기

var list = new List<Tuple<string, string>> 
    { Tuple.Create("dog", "cat"), Tuple.Create("fish", "frog") }; 

var result = 
    list.SelectMany(x => new[] {x.Item1, x.Item2}); 

foreach (string item in result) 
{ 
    Console.WriteLine(item); 
} 

결과 : 여기에 (내가 튜플 대신 단순 내 사용자 지정 형식을 사용하고) 하나의 방법

dog 
cat 
fish 
frog

이 나에게 내가 원하는 결과를 제공하지만, 더 나은 방식이있다 이것을 달성하십시오 (특히, 배열이나 콜렉션을 만들 필요없이)?

편집 :

이것은 또한 두 번 컬렉션 반복의 비용으로 작동합니다

var result = list.Select(x => x.Item1).Concat(list.Select(x => x.Item2)); 
+0

"원하는 결과"는 무엇입니까? 들쭉날쭉 한 배열이 있습니까? 익명의 타입 목록 만들기 ... –

+0

명백한 진술을 할 위험이 있으므로'var result = new [] { "dog", "cat", "fish", "frog"};'그러나 if 당신은 튜플의 목록으로 시작해야합니다. –

+0

@jmh_gr - 방금 명확성을 위해 질문을 편집했습니다. 'originalListFirstItem.StringProperty1','originalListFirstItem.StringProperty2','originalListSecondItem.StringProperty1','originalListSecondItem.StringProperty2' 등으로 구성된 IEnumerable 을 원합니다. – TrueWill

답변

2

다른 모음을 만들지 않으려면 대신 결과를 얻을 수 있습니다.

void Main() 
{ 
    var list = new List<Tuple<string, string>> 
     { Tuple.Create("dog", "cat"), Tuple.Create("fish", "frog") }; 

     foreach (var element in GetSingleList(list)) 
     { 
      Console.WriteLine (element); 
     } 
} 

// A reusable extension method would be a better approach. 
IEnumerable<T> GetSingleList<T>(IEnumerable<Tuple<T,T>> list) { 

    foreach (var element in list) 
    { 
     yield return element.Item1; 
     yield return element.Item2; 
    } 

} 
+0

* Very * nice. 나는 이것을 (a) 새로운 배열/콜렉션을 생성하지 않고 (b) 원래 콜렉션을 한번만 반복하는 것으로 받아 들인다. 매개 변수 유형은'IEnumerable '일 수도 있습니다. – TrueWill

+0

@TrueWill - 내 대답을 업데이트했습니다. –

2

나는 당신의 접근 방식은 잘 생각하고 내가 그 막대기 것입니다. 배열을 사용하면 SelectMany을 사용할 때 제대로 작업을 수행 할 수 있으며 최종 결과는 IEnumerable<string>입니다.

몇 가지 다른 방법이 있지만 사용자의 접근 방식보다 더 장황한 것 같습니다.

Aggregate 방법 :

var result = list.Aggregate(new List<string>(), (seed, t) => 
{ 
    seed.Add(t.Item1); 
    seed.Add(t.Item2); 
    return seed; 
}); 
result.ForEach(Console.WriteLine); 

ForEach 방법 : 새 List<string>를 만든 두 경우 모두

var result = new List<string>(); 
list.ForEach(t => { result.Add(t.Item1); result.Add(t.Item2); }); 
result.ForEach(Console.WriteLine); 

.

+1

+1, 특히 Aggregate! – TrueWill

관련 문제