我目前可以使用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);
谢谢你,祝你有愉快的一天
答案 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);