2010-07-05 3 views
2

나는 Foo에서 Baa까지 일대일 매핑 모음을 만들고 있습니다.LINQ를 사용하여이 알고리즘을 향상시킬 수 있습니까?

Baa에는 Foo의 고유 한 인스턴스 모음이 들어 있습니다.

Dictionary<Foo, Baa> mappings = new Dictionary<Foo, Baa>(); 

foreach (Baa baa in CollectionOfBaa) 
{ 
    foreach (Foo foo in baa.CollectionOfFoo) 
    { 
     mappings.Add(foo, baa); 
    } 
} 

LINQ를 사용하여이 작업을 수행 할 수있는 더 좋은 방법이 있나요 :

여기에 일을 몇 가지 코드는?

나는 사전을 KeyValuePair의 목록으로 대체하는 것이 바람직하지 않습니다.

감사합니다.

+3

Linq에 항상 (때문에 추가 오버 헤드) foreach는 루프보다 느리게 될 것입니다. foreach 루프가 작동하는 경우, 그것으로 붙어. –

+0

@Herbie : 대부분의 경우 성능이 가독성만큼 중요하지는 않습니다. 하지만 훨씬 더 읽기 쉬운 LINQ 버전을 찾지 못했습니다. =) – Jens

+1

가독성은 주관적입니다. 맞습니까? 나를 위해 foreach 버전이 가장 읽기 쉽습니다. –

답변

0

Summerising 모든 의견과 답변 우리가 얻을 :

속도 :는 LINQ를 사용하여 실제로 느립니다.

가독성 : 이것은 주관적이지만, 원래의 foreach 루프가 가장 읽기 쉽다는 내용의 모든 의견에 동의합니다.

원본 코드를 고수 할 것입니다.

모든 답변 주셔서 감사합니다. KeyValuePairs 허용하기 때문에

1
var keyValuePairs = from baa in CollectionOfBaa 
        from foo in baa.CollectionOfFoo 
        select new KeyValuePair(baa,foo); 

foreach item in keyValuePairs 
{ 
mappings.Add(item.key,item.Value); 
} 
5

당신은

var mappings = (from baa in CollectionOfBaa 
       from foo in baa.CollectionOfFoo 
       select new { foo, baa }).ToDictionary(e => e.foo, e=> e.baa); 
+1

와우, 대단한 효과가 없습니다. 3 개의 foreach 루프를 수행하여 n 개의 임시 객체를 생성하고 익명의 함수를 n * 2 번 호출합니다. 그리고 가독성을 추가하지도 않습니다 (IMHO). –

2

어떻게 개선 사용할 수 있을까? 공연? 아니요입니다. 가독성? 나를위한 것이 아닙니다.

음, 가독성을 위해이 코드를 사용해 보겠습니다. (여전히 foreach 버전을 선호합니다)?

CollectionOfBaa.ForEach(baa => 
    baa.ForEach(foo => 
     mappings.Add(foo, baa))); 
0

그들의는 IEnumerable을 고려

var mappings = from parent in CollectionOfBaa 
       from child in parent.CollectionOfFoo 
       select new KeyValuePair<Foo,Baa>(child, parent); 
관련 문제