Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在日志文件中找到两个集合的交集(使用LINQ)_C#_Linq - Fatal编程技术网

C# 如何在日志文件中找到两个集合的交集(使用LINQ)

C# 如何在日志文件中找到两个集合的交集(使用LINQ),c#,linq,C#,Linq,在我的工作场所,我有一个简化的日志文件,记录谁发过即时消息。对于我们的简单示例,让我们假设日志是一个文本文件,由两个制表符分隔的列组成。如果一个人是B,反之亦然,它会在日志中显示为AB或BA。IM的方向并不重要,只是这对情侣一直在互相接触 我有一个由两个研究小组组成的列表,X和Y,其中包含a、B、C等人的姓名。我的目标是通过查看日志文件,找出X和Y两个小组中的谁相互通信过。我不能对X组和Y组的成员在人数或不同成员方面做出任何假设 如果这是一个数据库,我会想象使用联接,但我想学习如何使用C#/LI

在我的工作场所,我有一个简化的日志文件,记录谁发过即时消息。对于我们的简单示例,让我们假设日志是一个文本文件,由两个制表符分隔的列组成。如果一个人是B,反之亦然,它会在日志中显示为AB或BA。IM的方向并不重要,只是这对情侣一直在互相接触

我有一个由两个研究小组组成的列表,X和Y,其中包含a、B、C等人的姓名。我的目标是通过查看日志文件,找出X和Y两个小组中的谁相互通信过。我不能对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)))
);
这可以分为三个部分,我们在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)));”我更新了答案,将其分解了一些。哈马辛。非常感谢你!我确实有。