2009-05-05 3 views
1

.NET WinForms 응용 프로그램에서 "비즈니스 객체"에 대한 간단한 검색 기능을 제공하는 가장 좋은 방법은 무엇입니까?.NET WinForms 앱에서 "비즈니스 개체"에 대한 간단한 검색을 구현하기위한 제안 사항은 무엇입니까?

"간단한 검색"이란 거의 모든 윈도우의 오른쪽 상단 구석에있는 Vista + Windows 7의 "검색 상자"와 같은 의미입니다.이 창의 내용을 검색합니다. "검색 - 간단하게 유지).

"비즈니스 개체"란 "클라이언트"및 "주소"(주로 간단한 일상 접촉 정보)와 같은 클래스를 기반으로하는 개체를 의미합니다.

"내 자신 만의"간단한 검색을 고려했습니다. 아마도 클래스가 "포함"기능을 구현하여 각 개체에 "포함"되어 있으면 사용자의 검색어가 포함되어 있는지 물어볼 수 있습니다. 얼마나 많은 단어가 매치되었는지에 기초한 간단한 순위의 정렬).

나는 또한 Lucene.NET을 살펴 봤지만 내 필요에 너무 복잡해 보인다. 인덱스를 작성하고 업데이트하고 유지 관리해야한다.

제안 사항? 아이디어?

+0

사용자가 비즈니스 개체를 검색하는 이유를 이해하는 데 실패했습니다. 나는 사용자가 컨트롤과 같이 볼 수있는 개체들 사이에서만 검색하려고한다고 생각합니다. 컨트롤에 표시되는 비즈니스 데이터 또는 반드시 화면에 표시되지 않는 기타 비즈니스 데이터를 검색하도록 지정 하시겠습니까? – NYSystemsAnalyst

+0

"비즈니스 객체"는 내가 호출 한 것입니다. 그것들은 "클라이언트"또는 "고객"또는 "주소"와 같은 것을 나타내는 객체입니다. 물론 사용자는 "존 스미스 64 메인 스트리트"를 입력 할 수 있고 존 스미스 (64 메인 스트리트에 살고있는 사람이 아니라 올바른 존 스미스를 얻을 수 있기를 바랍니다. 9012 Salsbury Ave에 살고있는 사람). – Keithius

답변

2

은 (내가 그랬다면 내가 구글에서 일 것입니다). 그렇지만, 필자는 수개월 전에 트릭을 한 개념 증명/고객 데모에서 비슷한 것을 구현했다.문제 도메인을 꽤 효과적으로, 특히 검색 가능한 데이터 세트의 크기로 제한 할 수 있었기 때문에 성능에는 문제가 없었습니다.

나는 FilterableListViewUserControl을 만들었습니다. 나는 세부 모드에서 ListView을 사용했으며, 바로 위에 TextBox을 놓았고 플랫폼 상호 작용을 사용하여 CueText ("필터"또는 "검색"과 같은 것)을 제공했습니다. 그런 다음 필터 상자의 마지막 TextChanged 이벤트 이후 0.5 초 지연이 있었던 경우 배경 스레드 (SafeInvoke의 구현과 동일)를 사용하여 ListView의 내용을 업데이트했습니다.

ListView의 지정된 필드 내용에 대해 대/소문자를 구분하지 않는 간단한 부분 일치를 수행 했으므로 빠르고 간단하며 효과적이었습니다. 나는 객체에 Linq가 매우 유용하다고 발견했습니다.

내가 더 생산 준비 구현을 위해 잘 할 것 몇 가지

:

  1. 검색을 수행하기 전에 적절한 지연을 계산하기 위해 더블 클릭 속도를 사용합니다.
  2. 컨트롤을 컨트롤에 추가하는 대신 검색을 수행하는 콜백 메커니즘을 제공하십시오. 아마도 IFilterable 인터페이스와 같은 것일까요?
+0

ListView에 반드시 열로 표시되지 않는 몇 개의 필드를 포함하고 싶습니다. – Keithius

0

나는 단순히 인스턴스를 설명하는 검색어 목록을 반환하는 모든 클래스에 간단한 인터페이스를 구현합니다. 그런 다음 모든 객체를 가져올 수 있으며 사용자가 제공 한 검색어를 기반으로 검색 용어를 묻고 순위를 매길 수 있습니다.

이것은 Contains 인터페이스 아이디어에 가깝지만 비즈니스 클래스에서 더 많은 로직을 유지합니다. 리플렉션을 통해 객체를 검사 할 수도 있으며 속성에 일부 사용자 속성을 추가하여 검색 엔진에 검색에 포함 할 속성에 대한 힌트를 줄 수도 있습니다.

그러나 모든 개체에 대한 모든 검색을 평가해야한다는 점에 유의하십시오. 복잡한 순위 지정 기능을 사용하면 약 100 개 정도의 객체를 넘어서는 속도가 느려집니다. 반사를 사용하면 상황이 더욱 악화됩니다.

해결해야 할 또 다른 문제는 검색 결과를 의미있는 방식으로 처리하는 방법입니다. 상당히 다른 클래스가있는 경우 결과를 표시하고 사용자가 해당 객체로 무언가를 할 수있는 응용 프로그램의 위치로 이동하는 것은 비재 정적 태스크 일 수 있습니다.

+0

고맙게도 저의 경우 클래스 수는 매우 적습니다. 일반적으로 1 ~ 2 개 정도입니다. 나는 성능 페널티를 두려워했었다. 그러나 나는 항상 BackgroundWorker 스레드로 그것을 퍼뜨릴 수 있었다고 생각한다. – Keithius

0

각 개체에 "포함"방법을 사용하는 것이 매우 유용하다고 생각합니다. (가) 방법이 일치하는 항목을 찾으면 포함되어있는 경우, 반환으로 " 점수"일종의을 줄 수 있도록

당신은 개체의 회원들에게 "무게"를 제공 할 수 있습니다.

다른 점은 일치 항목이 이거나 일치하지 않는지 ... 그 점수보다 많거나 적은 점수를 할당하는 것입니다.

여러 유형의 개체를 검색하는 경우 높은 값을 주 개체 (더 많은 비즈니스 중심 개체)에 할당하여 더 많은 우선 순위를 부여 할 수 있습니다. 나는 "최고"방법에 대해 알고하지 않습니다

만의 생각 ...

+0

고맙다; 그것들은 제 생각들 중 일부였습니다. 나는 내가 간과하고있는 이것을하기위한 확실하고 간단한 방법이 없는지 확인하기를 원한다고 생각한다. – Keithius

0

너무 많은 개체가 없으면 각 개체를 반복하면 설명하는대로 할 수 있습니다. 그냥 Contains 대신 정규 표현식을 사용하면 좀 더 유연하게 사용할 수 있습니다. Contains는 객체 내부의 속성에 대한 문자열 값 대신 객체에 대한 일치를 제공합니다. 문자열을 일치 시키면 더 유용 할 것입니다.

당신이 할 수있는 한 가지 방법은 객체에서 검색하려는 객체의 모든 문자열을 단순히 연결 한 문자열 인 메소드를 만드는 것입니다. 그런 다음 정규 표현식을 적용하여 해당 메서드의 결과 값을 검색합니다. 최고의 성능을내는 솔루션이 될 수는 없지만 쉽고 빠릅니다. 제가 말했듯이, 당신이 너무 많은 물체를 가지지 않는 한 괜찮을 것입니다.

+0

정규 표현식에 대한 농담이 있다고 생각합니다. ("이제는 2 가지 문제가 있습니까?")하지만 솔직히 고마워요. 나는 그것에 대해 생각하지 않았습니다. – Keithius

관련 문제