创建字典并在值表达式声明中使用键

时间:2016-05-27 10:25:01

标签: c# linq dictionary expression expression-trees

我有两个列表,想要创建一个键值对类型的字典 Key =每个唯一引用的字符串(字符串类型) Value = list2的子列表,其中list2 uniquereference等于Key(值为List类型)

我想在这样的情况下这样做

var dictionary = listA.ToDictionary(x => x.StringProperty, y => List2.Where(x => x.Reference == x.StringProperty)

如何在表达式声明中执行此操作?我目前有一种创建这个字典的方法吗?

我必须创建这个方法来生成我想要的东西。是否有表达式可以做同样的事情:

   private Dictionary<string, IEnumerable<JobEntity>> Dictionary(IEnumerable<JobLinkedBag> jobLinkedBags, IEnumerable<JobEntity> jobs)
    {
        if (jobLinkedBags == null || jobs == null || jobLinkedBags.Count() == 0 || jobs.Count() == 0)
            return null;

        var dictionary = new Dictionary<string, IEnumerable<JobEntity>>();

        for (int i = 0; i < jobLinkedBags.Count(); i++)
        {
            var thisBag = jobLinkedBags.ElementAt(i).LuggageCode;
            var jobsForThisBag = jobs.Where(x => x.LuggageCode == thisBag);
            dictionary.Add(thisBag, jobsForThisBag);
        }
        return dictionary;
    }

1 个答案:

答案 0 :(得分:1)

将方法1:1转换为表达式将如下所示:

Expression<Func<IEnumerable<JobLinkedBag>, IEnumerable<JobEntity>, Dictionary<string, IEnumerable<JobEntity>>>> expression =
        (jobLinkedBags, jobs) => (jobLinkedBags == null || jobs == null || jobLinkedBags.Count() == 0 || jobs.Count() == 0)
                ? null
                : jobLinkedBags.ToDictionary(
                             jlb => jlb.LuggageCode,
                             jlb => jobs.Where(job => job.LuggageCode == jlb.LuggageCode));

注意,此代码中存在一些危险部分:

  • 此代码多次枚举参数jobLinkedBagsjobs(以确定计数然后过滤它们),这可能会导致问题,具体取决于它们的具体IEnumerable实现< / LI>
  • 您构建了一个以IEnumerable为值的字典。这个枚举也是执行的。因此,当您最终将遍历它时,应确保此枚举的源仍然有效。