【问题标题】:How to use Enumerable Except in storing the difference of two strings with trimming如何使用 Enumerable 除了存储两个字符串的差异与修剪
【发布时间】:2014-03-04 12:02:35
【问题描述】:

我目前可以使用 Enumerable 来获取两个字符串的差异。

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

我需要这样做,因为我想比较第一个但不在第二个的字符串的所有 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);

谢谢你,祝你有美好的一天

【问题讨论】:

    标签: c# string file ienumerable


    【解决方案1】:

    您可以使用采用IEqualityComparerExcept 的重载。然后可以将比较器写入仅比较前 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);
    

    【讨论】:

    • 这对我来说非常有效 =) 虽然我想问,是否可以在不创建新类的情况下做到这一点?
    • @SaggerAl-Saadi 不,你必须创建那个新类。另一种选择与蒂姆的回答类似。
    【解决方案2】:

    你可以使用匿名类型和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;
    

    【讨论】:

    • 我很难分析代码,第一次看到这样的 C# 格式-继续分析-
    • 对不起,这是我的错,我需要复习更多,只是我感到不知所措,我在这里看到类似于数据库语言的关键字,我会在有机会理解并进一步尝试时更新,谢谢和欢呼
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    相关资源
    最近更新 更多