C# 如何在日志文件中找到两个集合的交集(使用LINQ)
在我的工作场所,我有一个简化的日志文件,记录谁发过即时消息。对于我们的简单示例,让我们假设日志是一个文本文件,由两个制表符分隔的列组成。如果一个人是B,反之亦然,它会在日志中显示为AB或BA。IM的方向并不重要,只是这对情侣一直在互相接触 我有一个由两个研究小组组成的列表,X和Y,其中包含a、B、C等人的姓名。我的目标是通过查看日志文件,找出X和Y两个小组中的谁相互通信过。我不能对X组和Y组的成员在人数或不同成员方面做出任何假设 如果这是一个数据库,我会想象使用联接,但我想学习如何使用C#/LINQ实现这一点。如何在日志文件中找到组X和组Y的交点 我想我想把lstGroupX和lstGroupY的成员联合起来,使其成员之间所有可能的1对1组合看起来像AB或BA,然后在日志文件中查找AB或BAC# 如何在日志文件中找到两个集合的交集(使用LINQ),c#,linq,C#,Linq,在我的工作场所,我有一个简化的日志文件,记录谁发过即时消息。对于我们的简单示例,让我们假设日志是一个文本文件,由两个制表符分隔的列组成。如果一个人是B,反之亦然,它会在日志中显示为AB或BA。IM的方向并不重要,只是这对情侣一直在互相接触 我有一个由两个研究小组组成的列表,X和Y,其中包含a、B、C等人的姓名。我的目标是通过查看日志文件,找出X和Y两个小组中的谁相互通信过。我不能对X组和Y组的成员在人数或不同成员方面做出任何假设 如果这是一个数据库,我会想象使用联接,但我想学习如何使用C#/LI
//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)))
);
这可以分为三个部分,我们在lstLog上的条件,我们在lstGroupY上的条件,以及我们在lstGroupX上的条件。lamda表达式应该读取x=>conditionx必须满足的条件(即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.Find(y=> x.Contains(y))
lstGroupY.Find(y=> x.Contains(y))
这将获取lstGroupX中的每个元素,并检查lstLog条件的当前元素是否包含该元素。所以,如果x在lstLog中表示“AB”,y在lstGroupX中表示“B”,那么这就是检查“AB”是否包含“B”。如果是,则返回“B”。如果找不到元素,那么它应该返回null(因此在其中添加了reason!string.IsNullOrEmpty)
第一组的条件:
lstLog.FindAll(x => !string.IsNullOrEmpty(<return element of lstGroupY condition>) && !string.IsNullOrEmpty(<return element of lstGroupX condition>))
lstGroupX.Find(y=> x.Contains(y))
lstGroupY.Find(y=> x.Contains(y))
这与lstGroupX的条件是一样的,不同的是它在lstGroupY中查看元素
把它们放在一起:
因此,将所有条件放在一起,它基本上会查看lstLog中的每个元素,如果lstGroupX中的一个元素包含在lstLog元素中,如果lstGroupY中的一个元素包含在lstLog元素中,它将被添加到返回集
需要注意的是,FindAll方法返回一个IEnumerable,而Find方法在找到第一个IEnumerable后将停止。您好,John,谢谢您的帮助。它非常密集,我在解析/解包语句时遇到困难。我想你在用一种我不熟悉的新东西..lambda表达式?你能帮我理解它的作用吗?“!string.IsNullOrEmpty(lstGroupY.Find(y=>x.Contains(y)));”我更新了答案,将其分解了一些。哈马辛。非常感谢你!我确实有。