Comment puis-je trouver un élément spécifique dans une Liste?
ma demande utilise une liste comme celle-ci:
List<MyClass> list = new List<MyClass>();
par la méthode Add
, une autre instance de MyClass
est ajoutée à la liste.
MyClass
prévoit, entre autres, les méthodes suivantes:
public void SetId(String Id);
public String GetId();
Comment trouver une instance spécifique de MyClass
en utilisant la méthode GetId
? Je sais qu'il y a la méthode Find
, mais je ne sais pas si ce serait le travail ici?!
8 réponses
utiliser une expression lambda
MyClass result = list.Find(x => x.GetId() == "xy");
Remarque: C# possède une syntaxe pour les propriétés. Au lieu d'écrire Set-et Get-methods( comment vous pourriez être utilisé à partir de Java), écrivez
private string _id;
public string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
value
est un mot-clé contextuel connu seulement dans le jeu accessor. Il représente la valeur attribuée à la propriété.
Puisque ce modèle est souvent utilisé, C# fournit automatiquement les propriétés implémentées. Il s'agit d'une version abrégée du code ci-dessus; cependant, la variable d'appui est cachée et non accessible (elle est accessible depuis la classe dans VB, cependant).
public string Id { get; set; }
vous pouvez simplement utiliser des propriétés comme si vous accédiez à un champ:
var obj = new MyClass();
obj.Id = "xy"; // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id; // Calls the getter.
en utilisant propriétés, vous rechercheriez des éléments dans la liste comme ceci
MyClass result = list.Find(x => x.Id == "xy");
vous pouvez également utiliser automatiquement les propriétés implémentées si vous avez besoin d'une propriété en lecture seule:
public string Id { get; private set; }
cela vous permet de régler le Id
dans la classe mais pas de l'extérieur. Si vous avez besoin de le définir dans des classes dérivées, vous pouvez aussi protéger le setter
public string Id { get; protected set; }
et enfin, vous pouvez déclarer des propriétés comme virtual
et les outrepasser en dérivant des classes, vous permettant de fournir différentes implémentations pour getters et setters; tout comme pour les méthodes virtuelles ordinaires.
depuis C# 6.0 (Visual Studio 2015, Roslyn) vous pouvez écrire des auto-propriétés getter-only avec un initialiseur en ligne
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
vous pouvez aussi initialiser les propriétés getter-only dans le constructeur à la place. Les auto-propriétés Getter-only sont true propriétés read-only, contrairement à automatiquement propriétés implémentées avec un setteur privé.
cela fonctionne aussi avec des auto-propriétés de lecture-écriture:
public string Id { get; set; } = "A07";
en commençant par C# 6.0, vous pouvez aussi écrire des propriétés en tant que membres ayant un corps d'expression
public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }
voir: .")
Nouvelles Fonctionnalités du Langage C# 6
commençant par C# 7.0 , les deux, getter et setter, peuvent être écrits avec des corps d'expression:
public string Name
{
get => _name; // getter
set => _name = value; // setter
}
noter que dans ce cas le setter doit être une expression. Il ne peut pas être une déclaration. L'exemple ci-dessus fonctionne, parce que dans C# une tâche peut être utilisée comme une expression ou comme une instruction. La valeur d'une expression d'affectation est la valeur assignée lorsque la cession elle-même est un effet secondaire. Cela vous permet d'attribuer une valeur à plus d'une variable à une fois: x = y = z = 0
est équivalent à x = (y = (z = 0))
et a le même effet que les énoncés x = 0; y = 0; z = 0;
.
var list = new List<MyClass>();
var item = list.Find( x => x.GetId() == "TARGET_ID" );
ou s'il n'y en a qu'un et que vous voulez faire appliquer que quelque chose comme SingleOrDefault
peut être ce que vous voulez
var item = list.SingleOrDefault( x => x.GetId() == "TARGET" );
if ( item == null )
throw new Exception();
vous pouvez résoudre votre problème de la façon la plus concise avec un prédicat écrit en utilisant la syntaxe de la méthode anonyme:
MyClass found = list.Find(item => item.GetID() == ID);
ou si vous ne préférez pas utiliser LINQ vous pouvez le faire à l'ancienne:
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
}
}
public List<DealsCategory> DealCategory { get; set; }
int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));
vous pouvez créer une variable de recherche pour maintenir vos critères de recherche. Voici un exemple d'utilisation de la base de données.
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
ici "var query" génère les critères de recherche que vous donnez à travers la variable de recherche. Puis " DuePaymentstring.Sélectionnez" est de sélectionner les données correspondant à vos critères donnés. N'hésitez pas à demander si vous avez un problème de compréhension.