如何使用Enumerable除了用修剪存储两个字符串的差异

时间:2014-03-04 12:02:35

标签: c# string file ienumerable

我目前可以使用Enumerable,但要获得两个字符串的区别。

我的目标是在检查file1Lines.Except(file2Lines)时将字符串的开头临时修剪为字符[]的20个字符,当它返回一个值时,我希望它再次成为完整的字符串[] / p>

我需要这样做,因为我想要比较第一个但不是第二个字符串的所有字符串的DIRECTORY并保存整行(日期时间就像我的字符串样本)

如果我不能使用Enumerable Except来实现这一目标,还有其他选择吗?

以下是我使用的示例字符串:

2009-07-14 04:34:14 \CMI-CreateHive{6A1C4018-979D-4291-A7DC-7AED1C75B67C}\Control Panel\Desktop

以下是我的示例代码:

        string[] file1Lines = File.ReadAllLines(textfile1Path);
        string[] file2Lines = File.ReadAllLines(textfile2Path);

        // This currently only gets a non-trimmed string, but if i trim it
        // it will return the trimmed string, I want it to return the full string again
        IEnumerable<String> inFirstNotInSecond = file1Lines.Except(file2Lines);
        IEnumerable<String> inSecondNotInFirst = file2Lines.Except(file1Lines);

谢谢你,祝你有愉快的一天

2 个答案:

答案 0 :(得分:1)

您可以使用匿名类型和Enumerable.Join

var lines1 = file1Lines
    .Select(l => new { Line = l, Firstpart = l.Split('\\')[0].Trim() });
var lines2 = file2Lines
    .Select(l => new { Line = l, Firstpart = l.Split('\\')[0].Trim() });

var inFirstNotInSecond = lines1.Select(x => x.Firstpart)
    .Except(lines2.Select(x => x.Firstpart));
var inSecondNotInFirst = lines2.Select(x => x.Firstpart)
    .Except(lines1.Select(x => x.Firstpart));

IEnumerable<String> inFirstNotInSecondLines =
    from l1 in lines1
    join x1 in inFirstNotInSecond on l1.Firstpart equals x1
    select l1.Line;
IEnumerable<String> inSecondNotInFirstLines =
     from l2 in lines2
     join x2 in inSecondNotInFirst on l2.Firstpart equals x2
     select l2.Line;

答案 1 :(得分:1)

您可以使用Except的重载IEqualityComparer。然后可以编写比较器,仅比较前20个字符后的字符串。这样Except将比较前20个字符后的字符串,但实际上不会截断返回的值。

public class AfterTwenty : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        if (x == null)
        {
            return y == null;
        }

        return x.Substring(20) == y.Substring(20);
    }

    public int GetHashCode(string obj)
    {
        return obj == null ? 0 : obj.Substring(20).GetHashCode();
    }
}

然后你可以这样打电话给Except

   var comparer = new AfterTwenty();
   var inFirstNotInSecond = file1Lines.Except(file2Lines, comparer);
   var inSecondNotInFirst = file2Lines.Except(file1Lines, comparer);