2016-07-31 4 views
0

Ich habe die folgenden ListenWie wähle ich eine Liste aus, in der sich eine Eigenschaft nicht in einer Liste von Ganzzahlen befindet?

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 

Ich brauche die Liste der relations zu ziehen, wo CurrentObjectId = 6 und RemoteObjectId nicht in der toExclude Liste ist.

Hier ist mein ReportObjectRelation Objekt

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; } 
} 

Hier ist, was habe ich versucht,

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

aber das ist mir den folgenden Fehler

gibt nicht ref out-Parameter toExceule eine anonyme Methode verwenden kann, Lambda-Ausdruck oder Abfrageausdruck.

Wie kann ich eine Liste von Relationen korrekt abrufen, in der CurrentObjectId == 6 und RemoteObjectId nicht in toExceule sind?

Antwort

1

Sie können einen out-Parameter nicht in einer anonymen Methode verwenden. Sie müssen es zuerst einer lokalen Variablen zuweisen. (Ich weiß nicht wirklich, warum Sie einen Ausgabeparameter in diesem Fall verwenden, weil Sie nicht, dass Ihnen ganzen Code nicht zeigen):

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

Wenn Sie Exists verwenden, können Sie so etwas wie dies ausprobieren können:

Dieser Trick ist rein, weil die Lambda-Ausdrücke die Lebensdauer der lokalen Variablen ändern.

+0

keiner funktioniert. Ich bekomme immer noch den gleichen Fehler – Jaylen

+0

@Jaylen überprüfen Sie die Bearbeitung. Sie müssen eine Kopie des out-Parameters zuweisen. Ich weiß nicht, warum Sie in Ihrem Fall einen Ausgabeparameter verwenden. – user3185569

+0

Erstellen einer Kopie der Lust funktionierte! danke – Jaylen

0

Man könnte so etwas wie diese versuchen, wenn Sie die Exists Methode nicht verwenden wollen:

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

Auf der anderen Seite, Sie nutzen Exists machen könnte. Diese Methode erwartet jedoch ein Prädikat.

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

Für weitere Informationen zu den letzteren, haben Sie bitte einen Blick here.

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

Sie können .Any() verwenden und dies wird eine foreach ein in toExceule Scheck tun, wenn ein == RemoteObjectId

1

List.Exists nimmt Prädikat, dh ein Delegat, der für ein Element in der wahr oder falsch zurückgibt Liste, kein Gegenstand selbst.

Sie möchten List.Contains, die ein Element zurücknimmt wahr oder falsch je nachdem, ob es in der Liste ist.

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

Siehe this fiddle für eine funktionierende Demo.

0

Die folgende LINQ-Abfrage ruft die gesamte Liste der Beziehungen ab, deren aktuelle Objekt-ID 6 entspricht und deren Remote-Objekt-ID nicht der inExclude-Liste enthalten ist.

var result = relations.Where(r => r.CurrentObjectId == 6 && !toExclude.Any(t => t == r.RemoteObjectId)).ToList(); 
Verwandte Themen