Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-生成一个接受任何类型的泛型foreach方法?_C#_Entity Framework_Reflection - Fatal编程技术网

C#-生成一个接受任何类型的泛型foreach方法?

C#-生成一个接受任何类型的泛型foreach方法?,c#,entity-framework,reflection,C#,Entity Framework,Reflection,我正忙着使用实体框架和web api(在控制器的PUT方法上)更新实体。对于更新对象上的每个集合属性,我循环检查并检查现有对象上的集合中是否存在每个项。如果没有,我就加上 问题是我在对象上有很多集合,我发现自己多次重复下面的代码 我有没有办法把它包装成一个泛型方法,并将该方法传递给两个集合进行比较?可能通过指定要检查的属性的名称和主键?例如,如何为foreach循环指定类型 foreach (HBGender gender in updated.HBGenders) {

我正忙着使用实体框架和web api(在控制器的PUT方法上)更新实体。对于更新对象上的每个集合属性,我循环检查并检查现有对象上的集合中是否存在每个项。如果没有,我就加上

问题是我在对象上有很多集合,我发现自己多次重复下面的代码

我有没有办法把它包装成一个泛型方法,并将该方法传递给两个集合进行比较?可能通过指定要检查的属性的名称和主键?例如,如何为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

提前谢谢。我希望这是有意义的。

以最简单的形式,您可以编写如下扩展方法:

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)的方法或类似的方法应该可以工作。你试过什么?