it-swarm.com.de

Finden Sie einen Artikel in der Liste nach LINQ?

Hier habe ich ein einfaches Beispiel, um ein Element in einer Liste von Strings zu finden. Normalerweise verwende ich für Schleife oder anonyme Delegaten, um dies folgendermaßen zu tun:

int GetItemIndex(string search)
{
   int found = -1;
   if ( _list != null )
   {
     foreach (string item in _list) // _list is an instance of List<string>
     { 
        found++;
        if ( string.Equals(search, item) )
        {
           break;
        }
      }
      /* use anonymous delegate
      string foundItem = _list.Find( delegate(string item) {
         found++;
         return string.Equals(search, item);
      });
      */
   }
   return found;
}

LINQ ist neu für mich. Ich bin gespannt, ob ich LINQ verwenden kann, um Artikel in der Liste zu finden. Wie wenn möglich

199
David.Chu.ca

Es gibt einige Möglichkeiten (beachten Sie, dass dies nicht ​​eine vollständige Liste ist).

1) Single gibt ein einzelnes Ergebnis zurück, löst jedoch eine Ausnahme aus, wenn keiner oder mehr als einer gefunden wird (was möglicherweise der Fall ist) oder vielleicht nicht, was Sie wollen):

string search = "lookforme";
List<string> myList = new List<string>();
string result = myList.Single(s => s == search);

Hinweis SingleOrDefault() verhält sich genauso, außer dass für Referenztypen Null oder für Werttypen der Standardwert zurückgegeben wird, anstatt eine Ausnahme auszulösen.

2) Wobei alle Elemente zurückgibt, die Ihren Kriterien entsprechen, sodass Sie möglicherweise eine IEnumerable mit einem Element erhalten:

IEnumerable<string> results = myList.Where(s => s == search);

3) First gibt den ersten Artikel zurück, der Ihren Kriterien entspricht:

string result = myList.First(s => s == search);

Hinweis FirstOrDefault() verhält sich genauso, außer dass für Referenztypen Null oder für Werttypen der Standardwert zurückgegeben wird, anstatt eine Ausnahme auszulösen.

446
Rex M

Wenn Sie den Index des Elements wünschen, wird dies ausgeführt:

int index = list.Select((item, i) => new { Item = item, Index = i })
                .First(x => x.Item == search).Index;

// or
var tagged = list.Select((item, i) => new { Item = item, Index = i });
int index = (from pair in tagged
            where pair.Item == search
            select pair.Index).First();

Sie können das Lambda im ersten Durchgang nicht loswerden.

Beachten Sie, dass dies ausgelöst wird, wenn der Artikel nicht vorhanden ist. Dies löst das Problem, indem auf nullfähige Ints zurückgegriffen wird:

var tagged = list.Select((item, i) => new { Item = item, Index = (int?)i });
int? index = (from pair in tagged
            where pair.Item == search
            select pair.Index).FirstOrDefault();

Wenn Sie den Artikel wünschen:

// Throws if not found
var item = list.First(item => item == search);
// or
var item = (from item in list
            where item == search
            select item).First();

// Null if not found
var item = list.FirstOrDefault(item => item == search);
// or
var item = (from item in list
            where item == search
            select item).FirstOrDefault();

Wenn Sie die Anzahl der übereinstimmenden Elemente zählen möchten:

int count = list.Count(item => item == search);
// or
int count = (from item in list
            where item == search
            select item).Count();

Wenn Sie möchten, dass alle Artikel übereinstimmen:

var items = list.Where(item => item == search);
// or
var items = from item in list
            where item == search
            select item;

Vergessen Sie nicht, die Liste für null in einem dieser Fälle zu überprüfen.

Oder verwenden Sie (list ?? Enumerable.Empty<string>()) anstelle von list.

Danke an Pavel für die Mithilfe in den Kommentaren.

70

Wenn es sich wirklich um einen List<string> handelt, brauchen Sie LINQ nicht. Verwenden Sie einfach:

int GetItemIndex(string search)
{
    return _list == null ? -1 : _list.IndexOf(search);
}

Wenn Sie den Artikel selbst suchen, versuchen Sie Folgendes:

string GetItem(string search)
{
    return _list == null ? null : _list.FirstOrDefault(s => s.Equals(search));
}
13
AgileJon

Möchten Sie das Element in der Liste oder das eigentliche Element selbst (würde das Element selbst annehmen)?.

Hier sind eine Reihe von Optionen für Sie:

string result = _list.First(s => s == search);

string result = (from s in _list
                 where s == search
                 select s).Single();

string result = _list.Find(search);

int result = _list.IndexOf(search);
10
Kelsey

Diese Methode ist einfacher und sicherer

var lOrders = new List<string>();

bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false

6
RckLN

Wie wäre es mit IndexOf

Sucht nach dem angegebenen Objekt und gibt den Index des ersten Vorkommens in der Liste zurück

Zum Beispiel

> var boys = new List<string>{"Harry", "Ron", "Neville"};  
> boys.IndexOf("Neville")  
2
> boys[2] == "Neville"
True

Beachten Sie, dass -1 zurückgegeben wird, wenn der Wert nicht in der Liste enthalten ist 

> boys.IndexOf("Hermione")  
-1
5
Colonel Panic

Hier ist eine Möglichkeit, Ihre Methode für die Verwendung von LINQ neu zu schreiben:

public static int GetItemIndex(string search)
{
    List<string> _list = new List<string>() { "one", "two", "three" };

    var result = _list.Select((Value, Index) => new { Value, Index })
            .SingleOrDefault(l => l.Value == search);

    return result == null ? -1 : result.Index;
}

Also ruf es mit an

GetItemIndex("two") wird 1 zurückgeben,

und

GetItemIndex("notthere") gibt -1 zurück.

Referenz: linqsamples.com

2
brinch

Ich habe früher ein Wörterbuch benutzt, eine Art indizierte Liste, die mir genau das gibt, was ich will, wenn ich es will.

Dictionary<string, int> margins = new Dictionary<string, int>();
margins.Add("left", 10);
margins.Add("right", 10);
margins.Add("top", 20);
margins.Add("bottom", 30);

Wenn ich beispielsweise auf meine Margenwerte zugreifen möchte, wende ich mich an mein Wörterbuch:

int xStartPos = margins["left"];
int xLimitPos = margins["right"];
int yStartPos = margins["top"];
int yLimitPos = margins["bottom"];

Abhängig davon, was Sie tun, kann ein Wörterbuch nützlich sein.

2

Wenn wir ein Element aus der Liste suchen müssen, können wir die Erweiterungsmethode Find und FindAll verwenden, es gibt jedoch einen geringfügigen Unterschied. Hier ist ein Beispiel.

 List<int> items = new List<int>() { 10, 9, 8, 4, 8, 7, 8 };

  // It will return only one 8 as Find returns only the first occurrence of matched elements.
     var result = items.Find(ls => ls == 8);      
 // this will returns three {8,8,8} as FindAll returns all the matched elements.
      var result1 = items.FindAll(ls => ls == 8); 
1

Dies hilft Ihnen dabei, den ersten oder Standardwert Ihrer Linq-Listensuche zu erhalten

var results = _List.Where(item => item == search).FirstOrDefault();

Bei dieser Suche wird der erste oder Standardwert gesucht, den er zurückgibt.

1
user1407955

Versuchen Sie diesen Code: 

return context.EntitytableName.AsEnumerable().Find(p => p.LoginID.Equals(loginID) && p.Password.Equals(password)).Select(p => new ModelTableName{ FirstName = p.FirstName, UserID = p.UserID });
1
Nayeem Mansoori

Sie möchten ein Objekt in der Objektliste durchsuchen.

Dies hilft Ihnen dabei, den ersten oder Standardwert Ihrer Linq-Listensuche zu erhalten.

var item = list.FirstOrDefault(items =>  items.Reference == ent.BackToBackExternalReferenceId);

oder

var item = (from items in list
    where items.Reference == ent.BackToBackExternalReferenceId
    select items).FirstOrDefault();
0
Huseyin Durmus