2009-12-01 3 views
2
list vclAsset<FullAsset> 
list callsigns<string> 

foreach(FullAsset fa in vclAsset) 
{ 
    if (callsigns.contains(fa.asset.callsign)) 
    { 
     //do something 
    } 

} 

위의 방법을 사용하는 것이 더 좋은 방법이 있습니까? FullAsset 개체에는 "Callsign"이라는 문자열이있는 Asset 개체가 들어 있습니다. 각 호출 부호는 고유 할 것이기 때문에 목록 호출 부호에는 각 문자열 중 하나만 포함되며 두 개의 FullAsset 객체는 Asset.callsign 변수를 공유하지 않습니다.foreach를 사용하는 것보다 목록을 통해 검색하는 것이 더 좋다

간단히 말해서 특정 호출 부호가있는 FullAssets를 모두 가져오고 싶지만 foreach를 사용하면 서투른 것처럼 보입니다 (주어진 목록에 포함될 수있는 FullAssets의 수에는 잠재적으로 상한이 없음).

+0

대답은 Linq에 –

답변

3

는이 같은 람다 식, 뭔가를 사용할 수 있습니다

foreach(FullAsset fa in vclAsset.Where(a => callsigns.contains(a.asset.callsign)) 
{ 
    // do something 
} 
+0

+1. 너는 더 빨랐어. 나는 대답을 지웠어. (그것은 == 너). – Zote

+1

더 멋지지만 대다수 문법적 인 설탕 –

3

키가 고유 한 경우 Dictionary 또는 Hashtable을 사용하여 검색 속도를 높일 수 있습니다.

특정 항목 만 찾으려는 경우 List<T>.Find 메서드를 사용하고 조건자를 제공 할 수 있습니다. 당신은 닷넷 3.5를 사용하는 경우 다른 사람이 언급 한대로 전체 목록 대 열거 (게으른 평가)를 반환 이후

FullAsset result = vclAsset.Find 
    (fa => callsigns.contains(fa.asset.callsign)); 

또는

List<FullAsset> results = vclAsset.FindAll 
    (fa => callsigns.contains(fa.asset.callsign)); 

는 LINQ Where는, 더 나은 해결책이 될 수 있습니다.

+0

당신은 또한 목록 .FindAll를 사용하고 –

+0

는 사실 내가 .FindAll 어쨌든 foreach 문을 사용할 수 아래 생각하는 술어를 제공 할 수있을 것입니다 있지만 전체 Linq에 그 않는, 깔끔한 물론 –

+0

:-) 보인다, 요점은 항상 foreach 문을 반복하지 않도록하고 조건 (조건부, 비교 등)에 집중하는 것입니다. – Groo

2

물론, LINQ를 사용하여.

var assets= vclAsset.Where(fullA=>allsigns.contains(fullA.asset.callsign)); 

에셋은 일부 열거 가능한 구조입니다.

나는 ... 영감을 100 Linq samples하고 더 우아한로 계산하지만 LINQ를 사용할 수 있는지

+1

+1 - 문법적으로 사용 된 답변과 유사합니다 (두 가지만 받아 들일 수 있다면!) - 성능에 차이가 있습니까? 아니면 순수하게 미적 변화입니까? linq 예제에 대한 많은 감사드립니다! – MoominTroll

+0

다른 답변이 도착했을 때 이미 응답의 절반을 입력했습니다. 나는 Linq을 처음 탐험 할 때 정말로 나를 도왔던 링크를 추가하고 싶었다. –

0

확실하지 학습

 var results = from fa in vclAsset 
         where callsigns.Contains(fa.asset.callsign) 
         select fa; 
0
var result = vclAsset.Where(x=>callsigns.Any(y=>x.asset.callsign==y)); 

추신을 추천 할 수 있습니다 vclAssetasset/callsign 속성으로 바꿉니다.

0

또한 결합 기능을 사용하여이를 수행 할 수도 있습니다.

나열된 호출 부호가있는 vclAssets의 목록입니다.

관련 문제