Lambda表达式循环遍历两个并发字典

4
我正在尝试循环遍历两个并发字典,例如以下代码,但我想使用一个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( ???? );

我真的不确定要传入什么参数到contains,我猜想是另一个lambda表达式,但具体是什么呢?


你的示例代码正在回答这个问题:“列表A中是否有任何内容与列表B中的记录匹配?”(如果是,写下“Found”)。 这是一个不同的问题,与var values =所暗示的“给我在列表A中与列表B中的记录匹配的记录”不同。 - Michael Blackburn
为了简化/澄清我的评论:您想要常见对象的结果列表(并将它们分配给“值”集合),还是如果存在匹配项,您想要执行某些操作(如Console.Writeline)?如果您想要结果列表,请使用Intersect,如果要检测是否有结果,请使用Any - Michael Blackburn
最后,如果您想创建一个副作用(比如在每个匹配上打印“Found”),请使用 ForEach(假设它们是Lists)。 - Michael Blackburn
4个回答

1
你可以使用 linq Intersect 函数 在列表中查找相似项。然后显示所有相似的项。
    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 方法,我认为你的假设是正确的。如果该类型不可比较,则可以像 @AnonymousTroll 建议的那样使用 Join 方法。 - Michael Blackburn

1

与您的循环最相近的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 对象,我可以进一步处理它。 - Maj

0

我认为你的朋友是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;
    }
}

0

如果您只想知道两个字典是否共享至少一个值,您可以使用 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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接