C#比较两个字符串数组

3

我有两个文件

"Database.txt" 包含以下名称:

  1. Dog
  2. Cat
  3. Mouse
  4. Panda
  5. Bear

"Slave.txt" 包含以下名称:

Cat
Panda

我想比较 "Slave.txt" 和 "Database.txt" 并创建第三个文件,其中包含:

2. Cat  
4. Panda  

(从 Slave.txt 中找到的 Cat 和 Panda 在 Database.txt 中)

我的代码:

static void Main(string[] args)
    {
        String directory = @"C:\Users\user\Desktop\";
        String[] linesA = File.ReadAllLines(Path.Combine(directory, "Database.txt"));
        String[] linesB = File.ReadAllLines(Path.Combine(directory, "Slave.txt"));
        IEnumerable<String> onlyB = linesB.Intersect(linesA);
        File.WriteAllLines(Path.Combine(directory, "Result.txt"), onlyB);
    }

该功能只适用于类似于 Database.txt 的结构:

Dog
Cat
Mouse
Panda
Bear

不带行号。 是否有其他方法(而不是使用 .Intersect)可以仅查找字符串的一部分,而不是整个字符串?


2
你想将"12. Blue Panda"与"Panda"进行匹配吗? - Taha Paksu
只需编写一个循环即可。或者如果你真的想使用LINQ,可以使用.Where(predicate func) - ryanyuyu
作为第二个参数,函数.intersect允许您放入一个自定义的相等比较器,您可以在其中决定如何比较您的对象。使用这个相等比较器,您可以创建一个字符串.contains(otherString)的等式,例如。或者更简单一点:使用jasonw的建议。 - Trickzter
3个回答

4
一种非常简单的方法是使用 Linq 中的 Any。它仅检查 B 中的任何一行的任何部分是否包含在 A 的任何一行中,不考虑大小写。
var onlyB = linesA.Where(a => linesB.Any(b => a.ToLower().Contains(b.ToLower())));

注意: 更新以显示来自A的行,而不是来自B的行。

在Result.txt中仍然显示为"Cat Panda"而不是"2. Cat 4. Panda"。 - Tommy
抱歉,可能我误解了你的问题。我以为你想要B行而不是A行,但没关系。我刚刚更新了答案来解决这个问题。 - Jason W

1
你可以这样使用Linq:
static void Main(string[] args)
    {
        String directory = @"C:\Users\user\Desktop\";
        String[] linesA = File.ReadAllLines(Path.Combine(directory, "Database.txt"));
        String[] linesB = File.ReadAllLines(Path.Combine(directory, "Slave.txt"));
        IEnumerable<String> onlyB = linesA.Where(x=>linesB.Contains(x.Substring(x.IndexOf(". "+1))));
        File.WriteAllLines(Path.Combine(directory, "Result.txt"), onlyB);
    }

再试一次,我做了一些改动。 - Mehdi
在 mscorlib.dll 中发生了类型为 'System.ArgumentOutOfRangeException' 的第一次机会异常。 在 mscorlib.dll 中发生了类型为 'System.ArgumentOutOfRangeException' 的未处理异常。附加信息:StartIndex 不能小于零。 - Tommy

0
这是我编写和测试的一个测试方法:
private string[] Matcher()
{
    string[] file1 = { "1. Dog","2. Cat","3. Mouse","4. Panda","5. Bear" };
    string[] file2 = { "Cat", "Panda" };
    string[] file3 = file1.Where(d => {
        foreach(string matcher in file2)
        {
            if(Regex.Match(d, @"^\d+\.\s+"+matcher + "$").Length > 0)
            {
                return true;
            }
        }
        return false;
    }).ToArray<string>();            

    return file3;
}

我猜你在file1中的记录前面有行号或项目编号。这将尝试使用正则表达式匹配数字组合、点和所需值,并当它与列表上的元素匹配时,将该元素添加到file3数组中。
当你只搜索Cat时,它会忽略Sabre Cat

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