C# - 创建一个接受任何类型的通用foreach方法?

时间:2014-01-10 12:28:37

标签: c# entity-framework reflection

我忙着使用实体框架和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

提前致谢。我希望这是有道理的。

3 个答案:

答案 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;
}