在Zip方法中订购字典

时间:2014-07-28 15:07:03

标签: c# linq

我使用LINQ Zip()方法创建Dictionary<TAbstraction,TImplementation>,以便在DI容器中注册所有类型。

TAbstraction是暴露的类型,其名称以汇编中的 Repository 结尾,而TImplementation是抽象的实现(名称以 Repository 结尾)位于另一个集会。

到目前为止,我已经按IEnumerable订购了两个Type.Name,并且可以执行注册但非常脆弱。

我保留了以约定命名的程序集中的类型(抽象必须被称为[objectname]Repository,而实现Sql[objectname]Repository)。

结果列表按字母顺序排序,因此如果我添加一个名为I[objectname]Repository的界面(或者更有可能,如果我之后的开发人员会这样做),列表顺序将会搞砸。

字典是这样创建的:

var dictionary = repositories.Zip(repositoriesImp, (r, rImp) => new { r, rImp })
                                          .ToDictionary(x => x.r, x => x.rImp);

我想在Zip()方法中或之后引入 where 子句,以避免意外错误,例如

var dictionary = (from r in repositories
                 join rImp in repositoriesImp
                 on //?
                 where rImp.Name.Contains(r.Name)
                 select new{
                     Key = r,
                     Value = rImp
                 }).ToDictionary(x=>x.Key,x=>x.Value);

MSDN我看到代理Func<TFirst, TSecond, TResult>你可以执行某些操作(他们使用三元运算符),所以我想知道你是否可以检查{ {1}}从那里开始。

2 个答案:

答案 0 :(得分:0)

var dictionary = repositories.Join(repositoriesImp, 
                                   x => x.Name, 
                                   y => y.Name, 
                                   (x, y) => new { Key = x, Value = y))
                             .ToDictionary(a => a.Key , a => a.Value );

答案 1 :(得分:0)

这是我的方法错了。我使用反射以正确的方式创建我的字典:

var repositoriesImp = typeof(SqlDataRepository).Assembly.GetExportedTypes()
                                  .Where(t => t.Name.EndsWith("Repository"))
                                  .ToList();
var dictionary = new Dictionary<Type, Type>();
foreach (var repositoryImp in repositoriesImp)
{
    var repository = typeof(DataRepository).Assembly.GetExportedTypes()
                                     .Where(t => repositoryImp.IsSubclassOf(t))
                                     .Single();
    dictionary.Add(repository, repositoryImp);
}

感谢大家指出我正确的方向。