2009-05-06 5 views
5

사전에서 삭제할 키와 사전이 있습니다. 이것은 지금 내 구현입니다 :LINQ를 사용하여 사전을 "제거"할 수 있습니까?

var keys = (from entry in etimes 
      where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) 
      select entry.Key).ToList(); 

foreach (var key in keys) 
{ 
    etimes.Remove(key); 
    count--; 
} 

제가 foreach 루프를 제거 할 수있는 것이 있습니까?

+1

그런데 .ToList()는 필요하지 않았습니다. foreach는 IEnumerable과 함께 작동합니다. –

+0

LINQ는 쿼리 언어로 기존 데이터를 변환하여 새 데이터를 만들 수 있습니다. 기존 데이터를 변경할 수 없습니다. – codymanix

답변

6
var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >= 
    Convert.ToInt64(stime)).ToDictionary(entry => entry.Key, 
     entry => entry.Value); 

이 문은 단순히 (당신이 가리 켰을 때, 다음 추가 코드를 요구하는) 에 대한 항목을 제거하는 것보다 오히려을 유지하는 선택 LINQ Where 기능을 사용하여 사전을 필터링합니다. ToDictionaryIEnumerable<KeyValuePair<TKey, TValue>>을 원하는 형식 인 Dictionary<TKey, TValue>으로 변환하며 KeyValuePair에서 키와 값을 선택하기 위해 두 개의 람다 식을 지정해야하기 때문에 매우 우아하거나 효율적이지는 않지만 적어도 간단합니다. (그리고 새 사전을 만듭니다.). 이 말을하면서, 나는 사전을 작게하거나 제거 할 항목의 수가 많으면 특히 문제로 보지 않습니다.

+0

그 방법으로 성능에 대해 언급하고 싶지는 않습니다. 당신이 신경 쓰면 두 가지 방법을 테스트하십시오. foreach를 사용하는 원래의 솔루션이 훨씬 더 빠를 것이라고 확신하지 못합니다. – Noldorin

+0

성능에 대해 걱정하지 않아도 언제든지 사전에 몇 개의 키만 있습니다. 나는 LINQ의 더 나은 핸들을 얻으려고 노력하고있다. 고마워,이게 잘됐다. – scottm

+0

이것은 새로운 사전을 생성하기 때문에 각 루프에 대해 단순한 것보다 훨씬 비쌀 수 있습니다. 그리고 가독성도 향상되지 않는다고 생각합니다. 그래서 나는 각 루프마다 막대기를 붙이고 어쩌면 (확장) 메서드로 옮길 수도 있지만 LINQ 솔루션에서는 전혀 승리하지 않는다. –

0
글쎄, 성능이나 가독성 문제는 제쳐 놓고,이 또한 다음과 같이 수행 할 수 없습니다

: 나는 특히 C#에서 정확한 구문 (100 % 확실하지 않다 내 코딩을 용서

<Extension> void itemDelete(List l, object item) { 
    l.Remove(item) 
} 

var keys = (from entry in etimes 
     where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) 
     select entry.Key).ToList(); 

keys.foreach(itemDelete()); 

을); 그 의사 코드를 고려해보십시오. 새 함수 추가 및 .foreach 함수는 LINQ 쿼리 끝에 있습니다. 이것이 VB에서 가능할 것이라는 것을 알고 있습니다. C#에서 비슷한 점이 있다고 가정합니다. 직접 작성하지 않으면 항상 .foreach 확장자를 작성할 수 있습니다. 개선 될 수도 있지만 개선되지 않을 수도 있습니다.

+0

이것이 멍청한 질문인데 용서해주십시오.하지만 부분 클래스에서이 Extension 메서드를 만들겠습니까? Extension 메서드를 사용하고 어떻게 사용하고 생성 할 수 있는지 계속 파악하려고합니다. – Jagd

+0

@ Jagd : 부분 클래스를 사용하는 이유는 어디에도 없습니다. 권장되는 방법은 * 정적 클래스 * 내에서 스스로 선언하고 비슷한 확장 기능을 정적 클래스로 그룹화하는 것입니다. – Noldorin

+0

VB에서 모듈로 만들면 ... Noldorin의 모범 사례를 들어보세요. – eidylon

관련 문제