2014-01-10 2 views
2

Я занят обновлением объекта с использованием структуры сущности и веб-api (по методу PUT контроллера). Для каждого свойства коллекции обновленного объекта я просматриваю и проверяю, существует ли каждый элемент в коллекции существующего объекта или нет. Если нет, я добавляю его.C# - Сделать общий метод foreach, который принимает любой тип?

Проблема в том, что у меня много коллекций объекта, и я неоднократно повторяю следующий код.

Есть ли способ для меня обернуть это в общий метод и передать этот метод 2 коллекциям для сравнения? Может быть, указав имя свойства для проверки и первичный ключ? Как я могу указать тип для цикла foreach, например?

foreach (HBGender gender in updated.HBGenders) 
     { 
      HBGender _gender = existing.HBGenders.FirstOrDefault(o => o.GenderID == gender.GenderID); 
      if (_gender == null) 
      { 
       //do some stuff here like attach and add 
      } 
     } 
return existing; //return the modified object 

Заранее спасибо. Я надеюсь в этом есть смысл.

+0

уверен, что работает, метод, который принимает два списка и предикат (Func ) или что-то в этом роде, должен работать. Что вы пробовали? – Default

ответ

2

В своей простейшей форме можно было бы написать метод расширения как таковой:

public static class IEnumerableExtensionMethods 
{ 
    public static ICollection<T> ForEachAndAdd<T>(this IEnumerable<T> self, 
                ICollection<T> other, 
                Func<T, T, bool> predicate) where T : class 
    { 
     foreach(var h1 in self) 
     { 
      if(other.FirstOrDefault(h2 => predicate(h1, h2)) == null) 
       other.Add(h1); 
     } 
     return other; 
    } 
} 

Использование:

List<HBGender> updated = new List<HBGender>(); 
List<HBGender> existing = new List<HBGender<(); 
return updated.ForEachAndAdd(existing, (h1, h2) => h1.Gender == h2.Gender); 

Обратите внимание, что если есть дополнительная логика необходима во время добавления, вы можете добавить Additonal Action<T> для этого.

0

Я не знаю, что вы пытаетесь сделать, но вы можете играть с этим примером:

List<object> a = new List<object>(); 
     a.Add("awgf"); 
     a.Add('v'); 
     a.Add(4); 
foreach (object b in a) 
     { 
      Type type = b.GetType().//Select more usefull 
      Convert.ChangeType(object,type); 
     } 
0

Просто пройти существующую функцию проверки, в качестве дополнительного параметра

public List<Class1> Find(List<Class1> updated, List<Class1> existing, Func<Class1, bool> predicate) 
{ 
    foreach (Class1 gender in updated) 
    { 
     Class1 _gender = existing.FirstOrDefault(predicate); //predicate for quoted example will be o => o.GenderID == gender.GenderID 
     if (_gender == null) 
     { 
      //do some stuff here like attach and add 
     } 
    } 
    return existing; 
} 
Смежные вопросы