C#-生成一个接受任何类型的泛型foreach方法?
我正忙着使用实体框架和web api(在控制器的PUT方法上)更新实体。对于更新对象上的每个集合属性,我循环检查并检查现有对象上的集合中是否存在每个项。如果没有,我就加上 问题是我在对象上有很多集合,我发现自己多次重复下面的代码 我有没有办法把它包装成一个泛型方法,并将该方法传递给两个集合进行比较?可能通过指定要检查的属性的名称和主键?例如,如何为foreach循环指定类型C#-生成一个接受任何类型的泛型foreach方法?,c#,entity-framework,reflection,C#,Entity Framework,Reflection,我正忙着使用实体框架和web api(在控制器的PUT方法上)更新实体。对于更新对象上的每个集合属性,我循环检查并检查现有对象上的集合中是否存在每个项。如果没有,我就加上 问题是我在对象上有很多集合,我发现自己多次重复下面的代码 我有没有办法把它包装成一个泛型方法,并将该方法传递给两个集合进行比较?可能通过指定要检查的属性的名称和主键?例如,如何为foreach循环指定类型 foreach (HBGender gender in updated.HBGenders) {
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
提前谢谢。我希望这是有意义的。以最简单的形式,您可以编写如下扩展方法:
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;
}
}
公共静态类IEnumerableExtensionMethods
{
公共静态ICollection ForEachAndAdd(此IEnumerable self,
i收集其他,
Func谓词),其中T:class
{
foreach(自身中的var h1)
{
if(other.FirstOrDefault(h2=>谓词(h1,h2))==null)
其他。添加(h1);
}
归还他人;
}
}
用法:
List<HBGender> updated = new List<HBGender>();
List<HBGender> existing = new List<HBGender<();
return updated.ForEachAndAdd(existing, (h1, h2) => h1.Gender == h2.Gender);
List updated=新列表();
List existing=new List我不知道您想做什么,但您可以使用以下示例:
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);
}
List a=新列表();
a、 添加(“awgf”);
a、 添加('v');
a、 增加(4);
foreach(a中的对象b)
{
Type Type=b.GetType()。//选择“更有用”
Convert.ChangeType(对象,类型);
}
只需将现有的检查函数作为额外参数传递即可
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;
}
公共列表查找(列表已更新、列表已存在、Func谓词)
{
foreach(更新中的1类性别)
{
Class1 _gender=existing.FirstOrDefault(谓词);//引用示例的谓词将是o=>o.GenderID==gender.GenderID
如果(_gender==null)
{
//在这里做一些事情,比如附加和添加
}
}
返回现有的;
}
确保它可以工作,一个包含两个列表和一个谓词(Func)的方法或类似的方法应该可以工作。你试过什么?