So überprüfen Sie, ob das List <T> -Element ein Element mit einem bestimmten Eigenschaftswert enthält


113
public class PricePublicModel
{
    public PricePublicModel() { }

    public int PriceGroupID { get; set; }
    public double Size { get; set; }
    public double Size2 { get; set; }
    public int[] PrintType { get; set; }
    public double[] Price { get; set; }
}

List<PricePublicModel> pricePublicList = new List<PricePublicModel>();

So überprüfen Sie, ob das Element von pricePublicListeinen bestimmten Wert enthält. Um genauer zu sein, möchte ich überprüfen, ob es existiert pricePublicModel.Size == 200? Wenn dieses Element vorhanden ist, wie kann man dann wissen, welches es ist?

BEARBEITEN Wenn Dictionary dafür besser geeignet ist, könnte ich Dictionary verwenden, aber ich müsste wissen wie :)

Antworten:


186

Wenn Sie eine Liste haben und wissen möchten, wo in der Liste ein Element vorhanden ist, das einem bestimmten Kriterium entspricht, können Sie die FindIndexInstanzmethode verwenden. Sowie

int index = list.FindIndex(f => f.Bar == 17);

Wo f => f.Bar == 17ist ein Prädikat mit den Übereinstimmungskriterien.

In Ihrem Fall könnten Sie schreiben

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 
{
    // element exists, do what you need
}

1
Was ist, wenn ich das Attribut dieses Wertes nicht kenne? zB Ich habe ein Listenelement, das "18.00" anzeigt. Ich weiß nicht, woher es kommt, also möchte ich überprüfen, welches Attribut diesen Wert hat. Im Grunde genommen und ähnlich wie in diesem Beispiel habe ich nicht die .size oder .bar, die ich herausfinden möchte
Haithem KAROUI

Was ist, wenn das Element nicht vorhanden ist? Wie hoch ist der Indexwert?
BKSpurgeon

8
HINWEIS: Wenn das Element nicht vorhanden ist, findIndexwird es zurückgegeben –1. Dokumentation: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
Tomloprod

1
@tomloprod Deshalb sucht er nach einem Index größer oder gleich Null. if (index> = 0). Könnte es auch so geschrieben haben, als ob (Index> -1).
DannyC

126
bool contains = pricePublicList.Any(p => p.Size == 200);

6
Dies ist streng zu sehen, ob es eine gibt.
Daniel A. White

3
Dies beantwortet die Frage nicht wirklich. Er sagte:how to know which one is it
George Johnston

15
Könnte seine Frage nicht beantworten, aber es hat mir sicher geholfen, weil ich sehen musste, ob ein Objekt mit einem bestimmten Namen bereits in meiner Sammlung vorhanden ist. Ich habe eine verbesserte .Contains-Methode erwartet - und genau das macht dieser LINQ-Ausdruck. Danke dir.
Igor

3
Es beantwortet die Frage im Titel . OP erklärt in seiner Beschreibung, dass er nicht genau das will, was er gesagt hat. Trotzdem gibt es einen von ihm und Dutzende von uns finden diese Frage über Google. Ich denke, es ist wichtiger, dass wir die richtige Antwort auf seine Titelfrage finden können.
MGOwen

5
Wenn jemand dies versucht und .Any () nicht erkannt wird, müssen Sie mit System.Linq hinzufügen . am Anfang Ihrer Datei.
MGOwen

31

Sie können die vorhandenen verwenden

if (pricePublicList.Exists(x => x.Size == 200))
{
   //code
}

13

Dies ist mit LINQ ziemlich einfach:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}

Ist es möglich, das Element, das dieser Bedingung entspricht, direkt zu bearbeiten? Nicht um es zu bekommen und in einem neuen Objekt zu speichern, sondern direkt zu ändern?
Ilija Veselica

Der zurückgegebene matchWert kann geändert werden (es ist das PricePublicModelObjekt, das in der Liste enthalten war).
Jacob

Sie sollten ein Objekt, das null sein kann, nicht direkt ändern. Sie können immer tun: match.Size = 300;oder foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Ich würde es allerdings nicht als Einzeiler verwenden.
Amy West

11

Sie benötigen hierfür eigentlich kein LINQ, da es List<T>eine Methode bietet, die genau das tut, was Sie wollen : Find.

Sucht nach einem Element, das den durch das angegebene Prädikat definierten Bedingungen entspricht, und gibt das erste Vorkommen innerhalb des gesamten Elements zurück List<T>.

Beispielcode:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200);

4
var item = pricePublicList.FirstOrDefault(x => x.Size == 200);
if (item != null) {
   // There exists one with size 200 and is stored in item now
}
else {
  // There is no PricePublicModel with size 200
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.