따라서 상태가 P이고 테이블의 OriginalPackageId 값이 레코드의 ID와 같은 요소가없는 모든 레코드를 테이블에서 원합니다.
이
IEnumerable<MyClass> table = ...
var result = table
.Where(record => record.Status == P
&& !table.Any(item => item.OriginalPackageId == record.Id));
이 효율적이지 않습니다, 모든 레코드에 대한 befause이 잠재적에 전체 표를 확인해야합니다 :
이 설명은 이미 나는 효율적인지 잘 모르겠어요하지만,이 작업을 수행하는 방법을 말한다 ID가 OriginalPackageId로 사용되지 않았는지 확인하십시오.
운 좋게도 레코드의 ID와 동일한 OriginalPackageId 값을 가진 레코드는 상관하지 않습니다. 따라서이 OriginalPackageId 값을 가진 레코드를 기억할 필요가 없습니다.
모든 레코드에서이 OriginalPackageId 값을 사용한다는 것을 기억하면됩니다.
먼저 사용 된 OriginalPackageIds를 HashSet<int>
개체에 넣으십시오. 이 경우 테이블 요소를 한 번 전달해야합니다.
IEnumerable<int> allOriginalPackageIds = table
.Select(record => record.OriginalPackageId);
HashSet<int> usedPackageIds = new HashSet<int>(allOriginalPackageIds);
HashSet의 생성자는 중복을 제거합니다.
이제 ID가 OriginalPackageID에서 사용되면 HashSet.Contains을 사용하여 조회 할 수 있습니다. 이것은 매우 빠른 기능입니다.
처럼 확장 기능은 다음과 같습니다 HashSet의는 O
public static IEnumerable<MyClass> ExtractOriginalItems(
this IEnumerable<MyClass> table)
{
IEnumerable<int> allOriginalPackageIds = table
.Select(record => record.OriginalPackageId);
HashSet<int> usedPackageIds = new HashSet<int>(allOriginalPackageIds);
foreach(var record in table)
{
// return elements with status P and not ID in hashset:
if (record.Status == P && !usedPackageIds.Contains(record.Id))
{
yield return record;
}
}
}
만들기 (1) 를 ForEach는 O (1)