int 배열과 int ID가 포함 된 개체 목록이 있습니다.다른 컬렉션의 값을 기반으로하는 필터 모음
int의 배열에 1,2,3 등이 들어 있으면 그 ID가 들어있는 객체를 얻고 싶습니다 (1, 2, 3 등).
어떻게 .NET 3.5에서이 작업을 수행 할 수 있습니까?
감사
int 배열과 int ID가 포함 된 개체 목록이 있습니다.다른 컬렉션의 값을 기반으로하는 필터 모음
int의 배열에 1,2,3 등이 들어 있으면 그 ID가 들어있는 객체를 얻고 싶습니다 (1, 2, 3 등).
어떻게 .NET 3.5에서이 작업을 수행 할 수 있습니까?
감사
작은 시퀀스를 다루는 경우 DaveShaw의 answer을 사용해도됩니다. ID 배열이 커지면 HashSet<T>
에 배열을로드 한 다음 집합을 사용하는 경우를 제외하고는 똑같은 쿼리를 수행하는 것이 더 효율적입니다.
var hashset = new HashSet<int>(ints);
var matches = objects.Where(obj => hashset.Contains(obj.Id));
, 당신은 또한 알아야 할에 대한 키에 따라 두 시퀀스와 일치하고 원하는 결과를 얻을 수 Enumerable.Join
.
var matches = from obj in objects
join id in ints
on obj.Id equals id
select obj;
// var matches = objects.Join(ints, obj => obj.Id, id => id, (obj, id) => obj);
Id
속성이 클래스의 인스턴스의 목록 objects
입니다 가정, 당신은 이런 식으로 할 수 있습니다.
var ints = new[] {1, 2, 3, };
var matches = ints.Intersect(objects.Select(obj => obj.Id));
이 int 타입으로 개체를 투영하고 교차 설정 작업을 수행합니다
var ints = new[] {1, 2, 3, };
var matches = objects.Where(obj => ints.Contains(obj.Id));
the where approach에 대한 대안은 다음과 같이 될 수 있습니다. 그냥 다른 접근법.
개체 컬렉션과 반대되는 ID 컬렉션을 반환하지 않습니까? – Henry
woops. 질문을 잘못 읽었다. 네가 옳아. – Foo42
또한 배열의 .Contains()는 결과에 대해 새 Set을 만들 필요가 없기 때문에 .Intersect()보다 효율적이어야합니다. – DaveShaw