【问题标题】:Better way to do what I need to do using LINQ?使用 LINQ 做我需要做的更好的方法?
【发布时间】:2012-11-16 19:43:57
【问题描述】:

我不确定是否有更有效的方式来做我正在使用 LINQ 做的事情...我有两个枚举:

枚举(字符串):{ "Andy", "Bill", "Charlie", "Doug" }
enumB(foo): { "Doug", "Edward", "George", "Bill" } (注意 enumB 实际上包含对象)

var dictionary = new Dictionary<string, 
foreach (var a in enumA)
{
    var b = enumB.SingleOrDefault(x => String.Equals(x.ToString(), a));

    if (b != null)
        dictionary[a] = b;
}

当我确定使用 LINQ 创建字典可能有更“正确”的方法时,一遍又一遍地枚举 enumB 并以这种方式创建字典对我来说似乎很糟糕。

【问题讨论】:

    标签: c# linq refactoring


    【解决方案1】:

    您可以使用

    有效地做到这一点
    join
    

    还有一个

    ToDictionairy
    

    之后打电话。

            var listA = "abcd";
            var listB = "cdef";
    
            var tuples = from charFromA in listA
                        join charFromB in listB
                        on charFromA.ToString() equals charFromB.ToString() // instead of ToString(), do something complex
                        select new { A = charFromA, B = charFromB };
    
            var dictionairy = tuples.ToDictionary(keySelector: t => t.A,elementSelector: t => t.B);
    

    【讨论】:

      【解决方案2】:
      var query = from b in enumB.Where(x => x != null)
                  join a in enumA on b.ToString() equals a
                  select new { a, b };
      var dictionary = query.ToDictionary(x => x.a, x => x.b);
      

      或者使用流畅的 API:

      var dictionary = enumB.Where(b => b != null)
                            .Join(enumA, 
                                  b => b.ToString(), 
                                  a => a, 
                                  (b, a) => new { a, b })
                            .ToDictionary(x => x.a, x => x.b);
      

      【讨论】:

        【解决方案3】:
        var dictionary = enumA
            .Join(enumB, a => a, b => b.ToString(), (a, b) => new { A = a, B = b })
            .ToDictionary(i => i.A, i => i.B);
        

        如果有任何重复键,这将抛出异常,因此您可以使用:

        var dictionary = enumA
            .Join(enumB, a => a, b => b.ToString(), (a, b) => new { A = a, B = b })
            .Aggregate(new Dictionary<string, Foo>(), (dict, i) => {
                dict[i.A] = i.B;
                return dict;
            });
        

        这将保留最后一个匹配值。

        【讨论】:

          【解决方案4】:
          var dict = enumA.Join(enumB, a => a, b => b, (a, b) => new {a, b})
                          .GroupBy(x => x.a)
                          .ToDictionary(x => x.Key, x => x.First());
          

          GroupBy 是为了消除 enumB 中可能的重复。

          如果 enumB 重复项不存在,您可以将其简化为

          var dict = enumA.Join(enumB, a => a, b => b, (a, b) => new {a, b})
                          .ToDictionary(x => x.a, x => x.b);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-01
            • 2017-05-23
            • 2010-09-25
            • 1970-01-01
            • 1970-01-01
            • 2020-11-07
            • 1970-01-01
            • 2010-12-02
            相关资源
            最近更新 更多