2009-07-25 4 views
0

다음 코드에서는 foreach 문을 3 개 사용하고 있습니다. 항목 목록이 다른 목록과 일치 할 때 목록을 채우기 만하면되지만 일치하지 않는 항목도 추가해야합니다. 그래서 다음과 같은 쉬운 방법이 있는지 궁금합니다.목록을 통한 C# 검색

 List<T> ds = new List<T>(); //is populated   
     foreach (var b in template.Bs) 
     { 
      List<BD> tempList = new List<BD>(); 
      foreach (BD bd in b.BDs) 
      { 
       Boolean found = false; 
       foreach (DV dv in items) 
       { 
        if (bd.C == dv.C) 
        { 
         found = true; 
         tempList.Add(new BD() 
         { 
          //populating 
         }); 
        } 
       } 
       if (!found) 
        tempList.Add(new BD() 
        { 
         //populating 
        }); 
      } 

     } 
+0

LINQ를 사용할 수 있습니까? –

+0

도움이 될 실제 코드를 게시하면 도움이 될 것입니다 ...이 조각은 외부 foreach 루프에 로컬 인 'tempList'를 채 웁니다. 따라서 효과적으로 외부 루프가 실제로 아무 것도 얻지 못합니다! – jerryjvl

+0

외부 루프는 여러 그룹의 목록을 거칩니다. 다음 루프는 해당 목록을 반복합니다. 다음 루프는 일치시키려는 목록을 반복하며 생성 된 새 목록에 데이터를 전달하지만 여전히 2 개의 foreach 목록을 유지해야합니다. 일치하지 않는 문서와 내부 foreach 루프와 일치하는 문서. 이것이 어디에서 복잡 해지는 지 보시오. – Bruce227

답변

6

dstempList 사이의 관계는 명확하지 않다,하지만 내부 루프가 정말 왼쪽 외부처럼 그것은 나에게 보이는 가입 : template.Bs의 각 b를 들어

List<T> ds = new List<T>(); //is populated   
foreach (var b in template.Bs) 
{ 
    var newBDs = from bd in b.BDs 
       join dv in items on bd.C equals dv.C into j 
       from dv in j.DefaultIfEmpty() 
       select dv == null ? NoMatch(bd) : Match(bd, dv); 

    List<BD> tempList = newBDs.ToList(); 

    // Do something with tempList 
} 

, 우리는 일치하고 bdb.BDs이고 dvitems입니다. NoMatch()은 타의 추종을 불허하는 bd을 기반으로 새 BD을 만들 것이며, Match()가 일치 기반으로 새 BD을 만들 것입니다 : 우리가 다음 호출하는 투사 방법을 결정하는 데 사용하는 일치, 없었다 경우 우리는 다음 dvnull을 넣어 DefaultIfEmpty()를 사용 bddv.

전체 쿼리는 newBDs으로 표시되며 IEnumerable<BD>이됩니다. 그런 다음 해당 시퀀스를 tempList에 버퍼링하거나 다른 유용한 방법을 사용할 수 있습니다.

+0

아, 그게 내가 찾고 있었던거야. 정말 고맙습니다!!! – Bruce227

+0

나는 그것을 구현했으며 완벽하게 작동합니다! 다시 한번 감사드립니다. – Bruce227

관련 문제