0

在我的工作场所,我有一个简化的日志文件,其中记录了谁已经 IM(即时消息)谁。对于我们的简单示例,假设日志是一个包含 2 个制表符分隔的列的文本文件。如果 A 与 B 联系,反之亦然,它在日志中显示为 AB 或 BA。IM 的方向无关紧要,只是两人一直在联系。

我有 2 个研究组 X 和 Y 的列表,其中包含 A、B、C 等人的姓名。我的目标是通过查看日志文件。我不能就人数或不同成员的数量对 X 组和 Y 组的成员做出任何假设。

如果这是一个我想使用连接的数据库,但我想学习如何使用 C#/LINQ 来做到这一点。如何在日志文件中找到 X 组和 Y 组的交集?

我想我想联合 lstGroupX 和 lstGroupY 的成员,使其成员之间所有可能的一对一组合看起来像 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)

但我不知道该怎么做。

4

1 回答 1

1

这应该可以完成工作:

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 => condition x must meet 之类的内容(即 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.IsNullOrEmpty 的原因)。

lstGroupY 的条件:

    lstGroupY.Find(y=> x.Contains(y))

这与 lstGroupX 的条件相同,只是它正在查看 lstGroupY 中的元素。

把它们放在一起:

因此,将所有条件放在一起,它基本上查看 lstLog 中的每个元素,如果 lstGroupX 中的元素包含在 lstLog 元素中,并且如果 lstGroupY 中的元素包含在 lstLog 元素中,它将被添加到返回放。

需要注意的是,FindAll 方法返回一个 IEnumerable,而 Find 方法一旦找到第一个就停止。

于 2013-10-10T03:53:37.697 回答