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 :)

ilija veselica
quelle

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
}
Anthony Pegram
quelle
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);
Daniel A. White
quelle
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
}
Tiago
quelle
13

Dies ist mit LINQ ziemlich einfach:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}
Jacob
quelle
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);
Mark Byers
quelle
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
}
Mahesh Velaga
quelle