2

검색 기능을 구현할 때 (예 : 기본 전자 메일 응용 프로그램의 검색과 같은 기능) - 50 개 항목으로 구성된 목록 상자가 있습니다. 각 항목은 문자열 필드가있는 클래스 객체에 바인딩됩니다. 문자열 필드 중 하나에서 검색 상자에 텍스트가있는 항목을 검색하고 표시하려고합니다. 사용자가 텍스트 상자에 키를 입력 할 때 ... - 두 가지 방법을 시도했습니다. ->입력하는 동안 검색 성능을 향상시키는 방법은 무엇입니까?

1 >> 사용 CollectionViewSource
는 -에서 모든 항목에 CollectionViewSource를 바운드 DB
- CollectionViewSource에 목록 상자를 바인딩
-에 그 함수 t에 대한 검색 수 - CollectionViewSource의 필터 속성을 설정 내선을 항목의 검색 상자에 넣고 모든 키 업 이벤트에서 e.Accepted -를 설정하십시오.
- 필터링은 잘 작동하지만 50 개 항목으로 느려집니다. (- 각 항목을 취하는 필터의 추측과 e.Accepted 속성을 설정할지 확인 의 keyup에 -하지만 부하에 대한 진정한
.... 하나의 DB 호출에 CollectionViewSource

2 >> 필터 @의 DB 수준
하여 파일러에 disply 할 요소를 결정하는 처리의 많은 것 같다 - 검색 상자에있는 텍스트를 검색 문자열이있는 객체의 ObservableCollection을 반환하는 ViewModel로 전송
- ObservableCollection이 목록 상자에 바인딩 됨
.... 최상위 레이어는 처리하지 않지만 각 Keypress에는 여러 DB 호출 - 여전히 느리지 만 접근법보다 빠릅니다.

다른 권장 사항이 있습니까? 또는 위에서 언급 한 접근법을 더욱 최적화하기위한 제안? - 검색을 원활하게 작동하도록 조정할 필요가 있습니까?

당신은 X 밀리 세컨드로 검색 조치를 지연하여 검색 프로세스를 더욱 최적화 할 수 있습니다
+0

당신은 샘플 의 검색이 가 가 http://stackoverflow.com/questions/5782585/filtering-an-observablecollection – JSJ

+0

안녕 난 이미 그 짓을 .. 방법 1을 참조하십시오 ...이 되었습니까 누군가가 성능을 향상시키기위한 아이디어가 있는지 궁금해합니다 ... 항목이 몇 개 있지만 괜찮 으면 좋겠지 만 50 개 항목으로 눈에 띄게 느립니다 ... – chancyjohn

+0

다음으로는 읽기 전용 항목으로 가야한다고 생각합니다. 그것은 성능을 끈기있게 증가시킬 것입니다. – JSJ

답변

1

사용자가 검색 조건의 기록을 계속 할 수 있도록

사전에 ... 고맙습니다 :) 모바일 디바이스에

처음 . 이렇게하면 각각의 새로운 입력 된 char은 xxx 밀리 초 단위로 검색 작업을 지연 시키며 작업이 트리거되는 마지막 char까지 10 번 호출 대신 하나의 호출 만 사용하면 성능이 향상됩니다. 엄밀히 말하자면 Timer 클래스를 사용하여이 작업을 수행 할 수 있습니다. 여기에 구현 방법을 보여주는 샘플 소스 코드 예제가 있습니다. 여기

private void txtSearchCriteria_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (txtSearchCriteria.Text == "Search ...") 
      return; 

     if (this.deferredAction == null) 
     { 
      this.deferredAction = DeferredAction.Create(() => ApplySearchCriteria()); 
     } 

     // Defer applying search criteria until time has elapsed. 
     this.deferredAction.Defer(TimeSpan.FromMilliseconds(250)); 
    } 


    private DeferredAction deferredAction; 


    private class DeferredAction 
    { 
     public static DeferredAction Create(Action action) 
     { 
      if (action == null) 
      { 
       throw new ArgumentNullException("action"); 
      } 

      return new DeferredAction(action); 
     } 

     private Timer timer; 

     private DeferredAction(Action action) 
     { 
      this.timer = new Timer(new TimerCallback(delegate 
      { 
       Deployment.Current.Dispatcher.BeginInvoke(action); 
      })); 
     } 

     public void Defer(TimeSpan delay) 
     { 
      // Fire action when time elapses (with no subsequent calls). 
      this.timer.Change(delay, TimeSpan.FromMilliseconds(-1)); 
     } 
    } 

    public void ApplySearchCriteria() 
    { 
     ICollectionView dataView = this.ViewSource.View; 

     string criteria = this.txtSearchCriteria.Text; 
     string lowerCriteria = criteria.ToLower(); 
     using (dataView.DeferRefresh()) 
     { 
      Func<object, bool> filter = word => 
      { 
       bool result = word.ToString().ToLower().StartsWith(lowerCriteria); 
       return result; 
      }; 

      dataView.Filter = l => { return filter.Invoke(l); }; 
     } 

     this.lstWords.ItemsSource = dataView;      
     if (this.lstWords.Items.Count != 0) 
     { 
      this.lblError.Visibility = Visibility.Collapsed; 
     } 
     else 
     { 
      this.lblError.Visibility = Visibility.Visible; 
     } 
    } 
+0

고맙습니다 :) ... 좋은 분 – chancyjohn

관련 문제