2016-07-31 1 views
0

나는 다음과 같은 목록이하나의 속성이 정수 목록에없는 목록을 선택하는 방법은 무엇입니까?

List<int> toExclude = new List<int>(); //Assume I have number between 1-10 

List<ReportObjectRelation> relations = new List<ReportObjectRelation>(); //Assume I have multiple `ReportObjectRelation` objects in this list 

내가 CurrentObjectId = 6RemoteObjectIdtoExclude 목록에없는 경우 relations의 목록을 당길 필요가있다.

여기, 여기

public class ReportObjectRelation 
{ 
    //Relation 
    public int Id { get; set; } 
    public string DisplayName { get; set; } 
    public string Alias { get; set; } 

    //Local Object 
    public int CurrentObjectId { get; set; } 
    public string CurrentObjectName { get; set; } 
    public int ForeignPropertyId { get; set; } 
    public string ForeignProperty { get; set; } 

    //Remote Object 
    public int RemoteObjectId { get; set; } 
    public string RemoteObjectName { get; set; } 
    public int LocalPropertyId { get; set; } 
    public string RemoteProperty { get; set; } 
} 

내가

var f = allRelations.Where(x => x.CurrentObjectId == 6 && !toExceule.Exists(x.RemoteObjectId)).ToList(); 

는 그러나 이것은 나에게

이 기준 출력 매개 변수 toExceule 익명의 방법을 사용할 수 없습니다 다음과 같은 오류를주고 뭘하려 내 ReportObjectRelation 객체

입니다 람다 식 또는 쿼리 식.

어떻게하면 CurrentObjectId == 6RemoteObjectIdtoExceule에없는 관계 목록을 올바르게 가져올 수 있습니까? 반면에

var f = allRelations.Where(x => x.CurrentObjectId == 6 
          && !toExclude.Contains(x.RemoteObjectId)) 
        .ToList(); 

당신이 Exists의 사용을 만들 수 있습니다 : 당신이 Exists 방법을 사용하지 않으려면

답변

1

익명 메서드 내에서 out 매개 변수를 사용할 수 없습니다. 먼저 로컬 변수에 할당해야합니다. (이 경우 출력 매개 변수를 사용하는 이유는 당신에게 전체 코드를 보여주지 않았기 때문에 난 정말 모르겠다) : 당신이 존재 사용하려는 경우, 당신은 이런 식으로 뭔가를 시도 할 수 있습니다

var copyOfList = toExceule; 
var f = allRelations.Where(x => x.CurrentObjectId == 6 
          && !copyOfList .Contains(x.RemoteObjectId)).ToList(); 

:

var f = allRelations.Where(x => x.CurrentObjectId == 6 
          && !copyOfList.Exists(y=> y == x.RemoteObjectId)).ToList(); 

이 트릭은 람다식이 로컬 변수의 수명을 변경하기 때문입니다.

+0

아무도 작동하지 않습니다. 나는 여전히 같은 오류가 발생합니다 – Jaylen

+0

@Jaylen 편집을 확인하십시오. out 매개 변수의 사본을 지정해야합니다. 나는 왜 당신이 당신의 경우에 출력 매개 변수를 사용하는지 모르겠습니다. – user3185569

+0

정욕의 복사본이 만들어졌습니다! 감사합니다 – Jaylen

0

당신이 뭔가를 시도 할 수 있습니다. 그러나이 메서드는 조건자를 필요로합니다.

var f = allRelations.Where(x => x.CurrentObjectId == 6 
          && !toExclude.Exists(te => te == x.RemoteObjectId)) 
        .ToList(); 

후자에 대한 자세한 내용은 살펴 here을하시기 바랍니다.

0
var f = allRelations.Where(x => x.CurrentObjectId == 6 
          && !toExceule.Any(a=>a==x.RemoteObjectId)) 
         .ToList(); 

당신이 .Any()를 사용하고 ==이

1

List.Exists을 RemoteObjectId 경우이 toExceule 검사의 foreach는 a를 할 것입니다은의 항목에 대해 true 또는 false를 반환 대리인 즉, 조건 소요 목록이 아니라 항목 자체.

원하는 항목이 목록에 있는지 여부에 따라 true 또는 false를 반환하는 List.Contains을 원합니다.

var f = allRelations.Where(x => x.CurrentObjectId == 6 
    && !toExclude.Contains(x.RemoteObjectId)).ToList(); 

작동 데모는 this fiddle을 참조하십시오.

0

LINQ 쿼리는 현재 개체 ID가 6이고 해당 원격 개체 ID가 toExclude List에 포함되지 않은 모든 관계 목록을 가져옵니다.

var result = relations.Where(r => r.CurrentObjectId == 6 && !toExclude.Any(t => t == r.RemoteObjectId)).ToList(); 
관련 문제