it-swarm.com.de

Wie finde ich ein bestimmtes Element in einer Liste <T>?

Meine Anwendung verwendet eine Liste wie folgt:

List<MyClass> list = new List<MyClass>();

Mit der Methode Add wird der Liste eine weitere Instanz von MyClass hinzugefügt.

MyClass bietet unter anderem folgende Methoden:

public void SetId(String Id);
public String GetId();

Wie kann ich mithilfe der Methode MyClass eine bestimmte Instanz von GetId finden? Ich weiß, dass es die Find-Methode gibt, aber ich weiß nicht, ob dies hier funktionieren würde ?!

91
Robert Strauch

Verwenden Sie einen Lambda-Ausdruck

MyClass result = list.Find(x => x.GetId() == "xy");

Hinweis: C # verfügt über eine integrierte Syntax für Eigenschaften. Schreiben Sie keine Getter- und Setter-Methoden (wie Sie es von Java gewohnt sind)

private string _id;
public string Id
{
    get
    {
        return _id;
    }
    set
    {
        _id = value;
    }
}

value ist ein kontextuelles Schlüsselwort, das nur im festgelegten Zugriffsmechanismus bekannt ist. Es stellt den der Eigenschaft zugewiesenen Wert dar.

Da dieses Muster häufig verwendet wird, bietet C # automatisch implementierte Eigenschaften . Sie sind eine kurze Version des obigen Codes. Die Hintergrundvariable ist jedoch verborgen und nicht zugänglich (sie ist jedoch innerhalb der Klasse in VB verfügbar).

public string Id { get; set; }

Sie können Eigenschaften einfach so verwenden, als würden Sie auf ein Feld zugreifen:

var obj = new MyClass();
obj.Id = "xy";       // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id;  // Calls the getter.

Mit den Eigenschaften würden Sie nach Elementen in der Liste suchen

MyClass result = list.Find(x => x.Id == "xy"); 

Sie können auch automatisch implementierte Eigenschaften verwenden, wenn Sie eine schreibgeschützte Eigenschaft benötigen:

public string Id { get; private set; }

Dadurch können Sie die Id innerhalb der Klasse festlegen, jedoch nicht von außen. Wenn Sie es auch in abgeleiteten Klassen festlegen müssen, können Sie den Setter auch schützen

public string Id { get; protected set; }

Schließlich können Sie Eigenschaften als virtual deklarieren und beim Ableiten von Klassen überschreiben, sodass Sie verschiedene Implementierungen für Getter und Setter bereitstellen können. genauso wie für gewöhnliche virtuelle Methoden.


Seit C # 6.0 (Visual Studio 2015, Roslyn) können Sie mit einem Inline-Initialisierer nur Getter-Auto-Eigenschaften schreiben

public string Id { get; } = "A07"; // Evaluated once when object is initialized.

Sie können stattdessen auch Getter-Eigenschaften innerhalb des Konstruktors initialisieren. Get-Only-Auto-Eigenschaften sind true schreibgeschützte Eigenschaften, im Gegensatz zu automatisch implementierten Eigenschaften mit einem privaten Setter.

Dies funktioniert auch mit Auto-Eigenschaften zum Lesen und Schreiben:

public string Id { get; set; } = "A07";

Ab C # 6.0 können Sie auch Eigenschaften als mit Elementen mit Ausdruck versehene Elemente schreiben

public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }

Siehe: .NET Compiler-Plattform ("Roslyn")
Neue Sprachfunktionen in C # 6

Beginnend mit C # 7.0 können Getter und Setter mit Ausdruckskörpern geschrieben werden:

public string Name
{
    get => _name;                                // getter
    set => _name = value;                        // setter
}

Beachten Sie, dass in diesem Fall der Setter ein Ausdruck sein muss. Es kann keine Aussage sein. Das obige Beispiel funktioniert, weil in C # eine Zuweisung als Ausdruck oder als Anweisung verwendet werden kann. Der Wert eines Zuweisungsausdrucks ist der zugewiesene Wert, bei dem die Zuweisung selbst ein Nebeneffekt ist. Auf diese Weise können Sie mehreren Variablen gleichzeitig einen Wert zuweisen: x = y = z = 0 entspricht x = (y = (z = 0)) und hat dieselbe Wirkung wie die Anweisungen x = 0; y = 0; z = 0;.

var list = new List<MyClass>();
var item = list.Find( x => x.GetId() == "TARGET_ID" );

oder wenn es nur eine gibt und Sie möchten, dass etwas wie SingleOrDefault das ist, was Sie wollen

var item = list.SingleOrDefault( x => x.GetId() == "TARGET" );

if ( item == null )
    throw new Exception();
18
zellio

Versuchen:

 list.Find(item => item.id==myid);
7
Amritpal Singh

Sie können auch LINQ extensions verwenden:

string id = "hello";
MyClass result = list.Where(m => m.GetId() == id).First();
4
Guffa

Oder wenn Sie nicht vorziehen, LINQ zu verwenden, können Sie dies auf die alte Schule tun:

List<MyClass> list = new List<MyClass>();
foreach (MyClass element in list)
{
    if (element.GetId() == "heres_where_you_put_what_you_are_looking_for")
    {

        break; // If you only want to find the first instance a break here would be best for your application
    }
}
3
Bjørn

Sie können Ihr Problem am präzisesten mit einem Prädikat lösen, das mit anonymer Methodensyntax geschrieben wurde:

MyClass found = list.Find(item => item.GetID() == ID);
3
David Heffernan
public List<DealsCategory> DealCategory { get; set; }
int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));
0

Sie können eine Suchvariable erstellen, die Ihre Suchkriterien enthält. Hier ist ein Beispiel mit Datenbank.

 var query = from o in this.mJDBDataset.Products 
             where o.ProductStatus == textBox1.Text || o.Karrot == textBox1.Text 
             || o.ProductDetails == textBox1.Text || o.DepositDate == textBox1.Text 
             || o.SellDate == textBox1.Text
             select o;

 dataGridView1.DataSource = query.ToList();

 //Search and Calculate
 search = textBox1.Text;
 cnn.Open();
 string query1 = string.Format("select * from Products where ProductStatus='"
               + search +"'");
 SqlDataAdapter da = new SqlDataAdapter(query1, cnn);
 DataSet ds = new DataSet();
 da.Fill(ds, "Products");
 SqlDataReader reader;
 reader = new SqlCommand(query1, cnn).ExecuteReader();

 List<double> DuePayment = new List<double>();

 if (reader.HasRows)
 {

  while (reader.Read())
  {

   foreach (DataRow row in ds.Tables["Products"].Rows)
   {

     DuePaymentstring.Add(row["DuePayment"].ToString());
     DuePayment = DuePaymentstring.Select(x => double.Parse(x)).ToList();

   }
  }

  tdp = 0;
  tdp = DuePayment.Sum();                        
  DuePaymentstring.Remove(Convert.ToString(DuePaymentstring.Count));
  DuePayment.Clear();
 }
 cnn.Close();
 label3.Text = Convert.ToString(tdp + " Due Payment Count: " + 
 DuePayment.Count + " Due Payment string Count: " + DuePaymentstring.Count);
 tdp = 0;
 //DuePaymentstring.RemoveRange(0,DuePaymentstring.Count);
 //DuePayment.RemoveRange(0, DuePayment.Count);
 //Search and Calculate

Hier generiert "var query" die Suchkriterien, die Sie über die Suchvariable vergeben. Dann wählt "DuePaymentstring.Select" die Daten aus, die Ihren angegebenen Kriterien entsprechen. Fühlen Sie sich frei zu fragen, ob Sie ein Problem haben.