如何在日志文件中找到 2 个集合的交集(使用 LINQ)
本文关键字:集合 LINQ 使用 日志 文件 | 更新日期: 2023-09-27 18:34:51
在我的工作场所,我有一个简化的日志文件,记录了谁有IM'ed(即时消息(谁。 对于我们的简单示例,假设日志是一个由 2 个制表符分隔的列组成的文本文件。 如果人员 A 向人员 B 发送即时消息,反之亦然,则在日志中显示为 AB 或 BA。 IM的方向并不重要,重要的是这对已经相互联系。
我有一个包含 2 个研究小组的列表,X 和 Y,其中包含 A、B、C 等人的名字。 我的目标是通过查看日志文件来找出 X 组和 Y 组中谁互相发送了 IM。 我无法根据人数或不同成员的数量对 X 和 Y 组的成员做出任何假设。
如果这是一个数据库,我会想象使用联接,但我想学习如何使用 C#/LINQ 做到这一点。 如何在日志文件中找到组 X 和组 Y 的交集?
我想我想联合 lstGroupX 和 lstGroupY 的成员,使其成员之间所有可能的 1 对 1 组合看起来像 AB 或 BA,然后在日志文件中查找 AB 或 BA。
//assume the log is in a list called lstLog
//a list called lstGroupX contains the names GroupX members
//a list called lstGroupY contains the names GroupY members
var IMBuddies = lstLog.Intersect(lstGroupX).Intersect(lstGroupY);
我认为上面的行不太正确。 我真正想要的是这样的东西
var IMBuddies = lstLog.Intersect(all possible permutations where lstGroupX members contacts lstGroupY members and vice versa)
但我不知道该怎么做。
这应该可以完成工作:
var IMBuddies = lstLog.FindAll(x =>
!string.IsNullOrEmpty(lstGroupX.Find(y => x.Contains(y))) &&
!string.IsNullOrEmpty(lstGroupY.Find(y => x.Contains(y)))
);
这可以分为 3 个部分,我们在 lstLog 上设置的条件,我们在 lstGroupY 上设置的条件,以及我们在 lstGroupX 上设置的条件。 lamda 表达式应该读作 x => 条件 x 必须满足(即 x => x.Id == 1 将获得 Id 为 1 的元素(。
lstLog 的条件:
lstLog.FindAll(x => !string.IsNullOrEmpty(<return element of lstGroupY condition>) && !string.IsNullOrEmpty(<return element of lstGroupX condition>))
简而言之,它要求所有不从 lstGroupX 条件返回 null 并且不会从 lstGroupY 条件返回 null 的元素
lstGroupX 的条件:
lstGroupX.Find(y=> x.Contains(y))
这将获取 lstGroupX 中的每个元素,并检查 lstLog 条件的当前元素是否包含该元素。 因此,如果 x 在 lstLog 中表示"AB",y 在 lstGroupX 中表示"B",则检查 "AB" 是否包含 "B"。 如果是这样,则返回"B"。 如果未找到任何元素,则它应返回 null(因此原因为 !string。IsNull或Empty被添加到其中(。
lstGroupY 的条件:
lstGroupY.Find(y=> x.Contains(y))
这与 lstGroupX 的条件执行相同的操作,只是它正在查看 lstGroupY 中的元素。
将它们放在一起:
因此,将所有条件放在一起,它基本上查看 lstLog 中的每个元素,如果 lstGroupX 中的元素包含在 lstLog 元素中,并且如果 lstGroupY 中的元素包含在 lstLog 元素中,它将被添加到返回集中。
应该注意的是,FindAll 方法返回一个 IEnumerable,而 Find 方法将在找到第一个后停止。