web-dev-qa-db-fra.com

Comment obtenir de la valeur de la collection IEnumerable en utilisant sa clé?

J'ai IEnumerable collection comme suit 

IEnumerable<Customer> items = new Customer[] 
{ 
     new Customer { Name = "test1", Id = 999 }, 
     new Customer { Name = "test2", Id = 989 } 
};

Je veux obtenir de la valeur en utilisant la clé Id 

J'ai essayé comme suit

public int GetValue(IEnumerable<T> items,string propertyName)
{
      for (int i = 0; i < items.Count(); i++)
      {
           (typeof(T).GetType().GetProperty(propertyName).GetValue(typeof(T), null));
           // I will pass propertyName as Id and want all Id propperty values 
           // from items collection one by one.
      }
}
5
Neo

// Je vais transmettre propertyName en tant qu'id et vouloir toutes les valeurs de propriété Id 

// de la collection d'objets un par un.

Si je vous comprends bien

public static IEnumerable<object> GetValues<T>(IEnumerable<T> items, string propertyName)
{
    Type type = typeof(T);
    var prop = type.GetProperty(propertyName);
    foreach (var item in items)
        yield return prop.GetValue(item, null);
}
9
Eser

Si vous souhaitez récupérer un nom Customer d'une collection par sa Id:

public string GetCustomerName(IEnumerable<Customer> customers, int id)
{
    return customers.First(c => c.Id == id).Name;
}
7
w.b

En utilisant LINQ, vous pouvez obtenir tous les noms de clients (valeurs) ayant un identifiant spécifique (clé) de cette manière:

var valuesList = items.Where(x => x.Id == 1).Select(v => v.Name).ToList();

Pour un nom de client unique, vous pouvez faire ceci:

var singleName = items.Where(x => x.Id == 1).FirstOrDefault(v => v.Name);

De toute évidence, l'ID peut être 1, 2 ou tout autre.

Modifier:

Je vous recommande List<Customer> au lieu de Customer[]

Alors,

var items = new List<Customer> 
{ 
     new Customer { Name = "test1", Id = 999 }, 
     new Customer { Name = "test2", Id = 989 } 
};
4
NASSER

Utilisez simplement LINQ pour réaliser ce que vous voulez faire. Si vous voulez récupérer une valeur spécifique, vous pouvez utiliser where comme ceci: 

public Customer GetCustomerById(IEnumerable<Customer> items,int key)
{
    return items.Where(x=>x.id==key)
   .Select(x =>x.Name)
   .First(); 
}

cela récupérera le client qui correspond à un identifiant spécifique. 

3
Nadeem Khoury

Voulez-vous rechercher les choses à plusieurs reprises après avoir créé la liste? Si tel est le cas, vous pouvez envisager de créer un dictionnaire pour effectuer les recherches, comme suit:

IEnumerable<Customer> items = new Customer[]
{
    new Customer {Name = "test1", Id = 999},
    new Customer {Name = "test2", Id = 989}
};

var lookup = items.ToDictionary(itemKeySelector => itemKeySelector.Id);

var result = lookup[989];

Console.WriteLine(result.Name); // Prints "test2".

Je suppose que vous ne créez pas la collection en premier lieu - si vous aviez le contrôle sur la création de la collection originale, vous pourriez utiliser un dictionnaire en premier lieu.

0
Matthew Watson