【问题标题】:Lambda expression to loop through two concurrent dictionaries遍历两个并发字典的 Lambda 表达式
【发布时间】:2016-01-11 14:57:56
【问题描述】:

我正在尝试像下面的代码一样遍历两个并发字典,但是我想改用 lambda 表达式

foreach (var s in sb_eventdata)
{  
    foreach (var f in final_data)
    {
        if (s.Value.Car.Equals(f.Value.Car))
        {
            Console.Writeline("Found!");
        }
    }
}

var values = sb_eventdata.Where(k => k.Value.Hometeam.Contains( ???? );

我真的不确定将什么传递给包含,我假设另一个 lambda 表达式但是什么?

【问题讨论】:

  • 您的示例代码正在回答问题“列表 A 中的任何内容是否与列表 B 中的记录匹配?” (如果是,写“找到”)。这与var values = 暗示的“给我列表 A 中与列表 B 中的记录匹配的记录”是不同的问题。
  • 为了简化/澄清我的评论:你想要得到常见对象的列表(并将它们分配给values 集合),或者如果存在匹配项,你想做什么(比如@987654325 @)?如果你想要结果列表,使用Intersect,检测有结果,使用Any。
  • 最后,如果你想创建一个副作用(比如在每场比赛中打印“Found”),请使用ForEach(假设它们是Lists)。

标签: c# loops dictionary concurrency lambda


【解决方案1】:

我认为你的朋友是 Join() 方法。

在“LinqPad 风格”中:

void Main()
{
    var a = new[] {
        new Car("Opel",200),
        new Car("Volkswagen",300),
        new Car("Audi", 500)
    };

    var b = new[] {
        new Car("Peugeot", 180),
        new Car("Seat", 300),
        new Car("Volvo", 480)
    };

    var c = a.Join(b, ak => ak.Value, bk => bk.Value, (ak,bk) => new {A=ak.Name,B=bk.Name,ak.Value});
    c.Dump();
}

// Define other methods and classes here

class Car {
    public string Name;
    public int Value;

    public Car (string name, int value) {
      Name = name;
      Value = value;
    }
}

【讨论】:

    【解决方案2】:

    如果您只想知道两个字典是否共享至少一个值,您可以使用 Any:

    if(sb_eventdata.Any(s => 
        final_data.Any(f => s.Value.Car.Equals(f.Value.Car))))
             Console.WriteLine("Found!");
    

    或包含:

    if(sb_eventdata.Any(s => final_data.ContainsValue(s.Value)))
             Console.WriteLine("Found!");
    

    如果你想计算final_data中有多少sb_eventdata:

    sb_eventdata.Where(s => final_data.ContainsValue(s.Value)).Count();
    

    【讨论】:

      【解决方案3】:

      您可以使用linq Intersect function 在列表中查找类似项目。 然后显示所有喜欢的项目。

          var foo = sb_eventdata.Select(o => o.Value.Car).Intersect(final_data.Select(o => o.Value.Car));
          foreach (var item in foo)
          {
      
              Console.Writeline("Found!");
      
          }
      

      【讨论】:

      • 只要集合类型实现IEquatable<T>,就可以。由于示例代码使用Equals,我认为您在这个假设上是站得住脚的。如果类型不相等,您将使用Join,就像下面建议的@AnonymousTroll。
      【解决方案4】:

      最接近循环的 linq 表达式是:

      var sb_eventdata = new Dictionary<string, string>{ {"a", "a"}, {"b", "b"}};
      var final_data = new Dictionary<string, string>{{"a", "a"}, {"b", "b"}, {"c","c"}};
      
      var result = 
          // first loop
          sb_eventdata.Select(s => 
              // second loop
              final_data.Where(f => s.Value.Equals(f.Value)))
          // flatten results (returns results from the first dictionary)
          .SelectMany(x => x);
      

      【讨论】:

      • 谢谢!这返回了 final_data 对象,我可以进一步处理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      相关资源
      最近更新 更多