2010-06-23 6 views
0

SortedDictionary<string, object>의 딥 복사본을 만드는이 foreach 루프를 작성하는 더 짧은 방법이 있다고 생각합니다. object은 그냥 자리 표시 자일 뿐이므로 실제로 다른 참조 유형을 사용하고 있습니다. 감사! 요점은,이 완벽하게 짧은 뭐죠이 .NET foreach 루프를 더 짧게 쓸 수 있습니까?

foreach (KeyValuePair<string, object> entry in sortedDictionary) 
{ 
    this.mSortedDictionary.Add(entry.Key, new object()); 
} 
+4

글쎄, 나는 1 줄 대신 0 줄로 쓸 수 있다고 생각하지만, 아마도 그다지 도움이 안 될 것입니다. –

+3

한 줄보다 짧습니까? 당신은 잘못된 것들에 대해 걱정하고 있습니다. –

+0

당신은 변수 이름을'a','b' 등으로 바꿀 수 있고 몇 개의 문자를 저장할 수 있습니다 - 당신이해야한다는 것을 의미하지는 않습니다. 너 뭐야? 성능 -'for' 루프는'foreach'보다 빠르지 만 열거 자에 대한 트랜잭션 측면을 상실합니다 – STW

답변

5

: 여기

는 코드입니다.

기록을 위해이 작업을 수행하는 Dictioary (또는 IDictioary)의 확장 방법을 만들 수 있습니다. 그 다음부터는 임의의 딕셔너리에서 확장 메서드를 호출 할 수 있습니다.

3
mSortedDictionary = sortedDictionary.ToDictionary(kvp => kvp.Key, kvp => new Object()); 
+1

... 이것은 동일하지 않습니다. 원래 코드가 기존 사전에 항목을 추가하는 중일 수 있습니다 ... – Lucero

+0

제발 .. 람다는 단지 두 달 동안 코드를 읽어야 할 때 다른 사람의 일을 더 어렵게 만듭니다.) – PjL

-1
foreach(string key in sortedDictionary.Keys) { 
    mSortedDictionary.Add(key, new object()); 
} 
+0

OP는'new object()'줄은 단지 원래의 사전에 의해 참조 된 객체의 deep-copy를위한 자리 표시 자라고 말했습니다. 키를 열거해도 문제가 해결되지 않습니다. – drharris

+0

물론 mSortedDictionary.Add (key, sortedDictionary [key] .Clone()); ..하지만 "아마도"는 질문에 대한 해석을 나타냅니다. – PjL

1

잡고 nVentive 우산 확장 라이브러리 (http://umbrella.codeplex.com)과 : 프로그램의 엄지 손가락의 규칙

sortedDictionary.ForEach(s => mSortedDictionary.Add(s, new object())); 
2

하나 :하는 catamorphism이 다른 모든 루프는 (또한 fold라고 , reduce, inject:into: 또는 inject). 이것은 또한 여기에 해당됩니다.

sortedDictionary.Aggregate(mSortedDictionary, (d, e) => { 
    d.Add(e.Key, Transform(e.Value)); return d; }); 

참고 : 고맙게도 LINQ 사업자 중 하나는 마이크로 소프트가 Aggregate를 호출 우리에게 catamorphism는 제공이는 더 K의 콤비와 destructuring 바인딩을 사용하여 간단하게 할 수있다. 불행히도, 나는 BCL에서 K 결합자를 찾을 수 없었습니다. 비록 내가 어쩌면 이있을 것이라고 확신합니다. (아무도 모른다면 나에게 말해주세요.)

이 예제의 목적을 위해, 나는 자신의 K 결합기를 제공 할 것이고, 나는 그것이라고 불리는 것보다 다른 어떠한 이유로도 Tap이라고 부를 것이다. Ruby :

public static T Tap<T>(this T o, Action<T> f) { f(o); return o; } 

말 그대로 문자 그대로입니다. (글쎄, 당신이 스레드 안전 및 예외 중 & hellip 무시 적어도 경우;)을 K 연결자를 사용

을, 우리는이에 도착 : 눈에 훨씬 더 쉽게

sortedDictionary.Aggregate(mSortedDictionary, (d, e) => d.Tap(dd => 
    dd.Add(e.Key, Transform(e.Value)))); 

합니다.

불행하게도, 우리는 스스로 결박 destructuring 추가 할 수 있지만, C#을 지원 destructuring 바인드를 한 경우에, 그것은 더 같을 것이다 :

sortedDictionary.Aggregate(mSortedDictionary, (d, {k, v}) => d.Tap(dd => 
    dd.Add(k, Transform(v)))); 

[주 :이 예에서 I가 개체 초기화 구문을 사용 . 바인드를 destructuring 예를 들어

, 루비, 이 destructuring 바인드와 K 연결자 모두가 않는, 그 결과는 다음과 같습니다

sorted_dictionary.reduce(m_sorted_dictionary) {|d, (k, v)| 
    d.tap {|d| d[k] = transform(v) } 
} 
+0

와우 ... 나는 배울 것이 많다. –

+0

정말 대단합니다. : D –

관련 문제