web-dev-qa-db-ja.com

キーを使用してIEnumerableコレクションから値を取得するにはどうすればよいですか?

次のようなIEnumerableコレクションがあります

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

キーIdを使用して値を取得したい

次のようにしてみました

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.
      }
}
8
Neo

// propertyNameをIdとして渡し、すべてのIdプロパティ値が必要です

//アイテムコレクションから1つずつ。

私があなたを正しく理解しているなら

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);
}
10
Eser

コレクションからCustomer名をIdで取得する場合:

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

LINQを使用すると、次のように特定のID(キー)を持つすべての顧客名(値)を取得できます。

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

単一の顧客名の場合、これを行うことができます:

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

明らかに、Idは1、2、またはその他のいずれでもかまいません。

編集:

お勧めしますList<Customer> の代わりに Customer[]

そう、

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

LINQを使用して、やりたいことを実現します。特定の値を取得したい場合は、次のようにwhereを使用できます。

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

これにより、特定のIDに一致する顧客が取得されます。

5
Nadeem Khoury

リストを作成した後、繰り返し検索しますか?その場合は、次のように、ルックアップを行うためのディクショナリを作成することを検討してください。

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".

そもそもコレクションを作成しないことを想定しています。元のコレクションの作成を制御できれば、そもそも辞書を使用できます。

0
Matthew Watson