我忙着使用实体框架和web api(在控制器的PUT方法上)更新实体。对于更新对象上的每个集合属性,我遍历并检查现有对象上的集合中是否存在每个项目。如果没有,我添加它。
问题是我在对象上有很多集合,我发现自己多次重复以下代码。
我有没有办法将它包装成一个泛型方法并将该方法传递给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 :(得分: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);
请注意,如果在添加过程中需要额外的逻辑,则可以添加一个额外的Action<T>
参数来执行此操作。
答案 1 :(得分: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);
}
答案 2 :(得分: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;
}