LINQ IsAssignableFrom检查两个Type []?

时间:2014-04-13 14:01:03

标签: c# linq

让我们说出以下类型:

public class Object { }
public class GameObject : Object { }
public class Component : Object { }
public class Transform : Component { }

两个Type[]

var t1 = new [] { typeof(Object), typeof(Component) };
var t2 = new [] { typeof(GameObject), typeof(Transform) };

扩展方法:

Console.Writeline(t1.IsAssignableFrom(t2); // prints true

我以基本的方式编写了这个方法:

public static bool IsAssignableFrom(this Type[] to, Type[] from)
{
    if (to.Length != from.Length) return false;
    for (int i = 0; i < to.Length; i++) {
        if (!to[i].IsAssignableFrom(from[i]))
            return false;
    }
    return true;
}

但是不能用LINQ方式写它...... - 不知道使用什么方法:s

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

我怀疑你只是在寻找:

return to.Length == from.Length &&
       to.Zip(from, (t, f) => t.IsAssignableFrom(f))
         .All(x => x);

这里对Zip的调用只是将两个序列的第一个元素相互拉开,然后是第二个元素等 - 在每对上应用指定为(t, f) => t.IsAssignableFrom(f)的操作。 All只检查结果序列是否为真。

根据您的调用方式,可能想让长度不同的错误,而不是只返回false

if (to.Length != from.Length)
{
    throw new ArgumentException("...");
}
return to.Zip(from, (t, f) => t.IsAssignableFrom(f))
         .All(x => x);

答案 1 :(得分:1)

这是另一种解决方案:

public static bool IsAssignableFrom(this Type[] to, Type[] from)
{
    if (to.Length != from.Length) return false;

    return to.Select((type, idx) => new { type, idx })
             .All((x) => x.type.IsAssignableFrom(from[x.idx]));
}

或者:

int i = 0;
return to.All(x => x.IsAssignableFrom(from[i++]));