2010-06-03 4 views
4

각 프레임에는 int 프레임 속성이있는 객체 컬렉션이 있습니다. int가 주어 졌을 때, 가장 가까운 Frame을 가진 콜렉션 내에서 오브젝트를 찾고 싶습니다. 여기 Linq로 검색

내가 지금까지 뭘하는지입니다 :

public static void Search(int frameNumber) 
{ 
    var differences = (from rec in _records 
         select new { FrameDiff = Math.Abs(rec.Frame - frameNumber), Record = rec }).OrderBy(x => x.FrameDiff); 

    var closestRecord = differences.FirstOrDefault().Record; 

    //continue work... 
} 

가 내 컬렉션에 20 만 개 항목이 나는 매우 자주이 메소드를 호출 제외하고는이, 크고 전부입니다. 이 작업을 수행하는 비교적 쉽고 효율적인 방법이 있습니까?

+1

은 개체 컬렉션 또는 LINQ to SQL 컬렉션에 대한이 LINQ입니까? – Jimmy

+0

"나는 객체들의 집합을 가지고있다."라는 질문에 첫 번째 문장이있다. ;) – jsmith

답변

5
var closestRecord = _records.MinBy(rec => Math.Abs(rec.Frame - frameNumber)); 

MoreLINQ에서 MinBy를 사용합니다.

3

프레임을 Frame으로 정렬 된 데이터 구조에 저장하는 것이 좋습니다. 그러면 주어진 프레임 번호에 가장 가까운 것을 찾아야 할 때 이진 탐색을 할 수 있습니다.

+0

아마도 SortedList 콜렉션을 데이터 구조로 조사하십시오. – Reddog

+0

포인트는 linq에서 그것을 할 수 있습니까? 어떻게 이것이 린크일까요? 코드 예제? – jsmith

+0

나는 linq을 사용하지 않는 해결책이 좋을 것이다. 나는 단지 "단순한"것을 찾고 있습니다. – Phil

0

하나 ALA로 문을 결합 할 수 있습니다 :

var closestRecord = (from rec in _records 
        select new { FrameDiff = Math.Abs(rec.Frame - frameNumber), 
        Record = rec }).OrderBy(x => x.FrameDiff).FirstOrDefault().Record; 
+2

나는 그의 문제가 (실제로 필요하지 않은) 일종의 정렬이 매우 오랜 시간이 걸린다 고 믿는다. – Ghostrider

0

은 어쩌면 당신은 5에서 큰 ITEMLIST를 나눌 수 - 자신의 Framediff 또는 무언가에 의해 정렬됩니다 작은 10 목록?

당신이

1

은 내가 이것에 대한 LINQ를 사용하는 것이 모르겠어요 검색 할 필요가 나열되는 최소한 아닌 ORDERBY 함께 알고있는 경우 검색이 빠른이 방법.

static Record FindClosestRecord(IEnumerable<Record> records, int number) 
{ 
    Record closest = null; 
    int leastDifference = int.MaxValue; 

    foreach (Record record in records) 
    { 
     int difference = Math.Abs(number - record.Frame); 
     if (difference == 0) 
     { 
      return record; // exact match, return early 
     } 
     else if (difference < leastDifference) 
     { 
      leastDifference = difference; 
      closest = record; 
     } 
    } 

    return closest; 
} 
+0

이것은 dtb의 답변에서 제안 된 것처럼 MoreLINQ의 'MinBy'메소드가 작동하는 방식과 거의 비슷합니다. ('MinBy'가 정확한 일치를 위해 조기 퇴출을 할 수는 없지만) – LukeH

+0

소장품을 소지 한 경우 조기 퇴실을 할 수 있습니다. 또한 "for"루프를 사용하면 마지막으로 사용한 인덱스를 기억하고 컬렉션 시작 부분이 아닌 검색을 시작할 수 있습니다. 간결하고 빠른 균형. 그것이 내가 궁극적으로하기로 결심 한 것입니다. – Phil