C# .Contains 没有返回正确的结果
C# .Contains not returning correct result
我有一个包含地址的文件,我想检查地址是否正确。我正在将地址与批准的澳大利亚州列表进行比较。
我的地址文件看起来像这样:
NEW SOUTH WALE
N S W 2232
SOUTH AUSTRALI
Victoria
SA 5158
Victoria 3136
Victoria 3029
N.S.W. 2428
我在澳大利亚各州的批准文件是:
NEW SOUTH WALES
QUEENSLAND
SOUTH AUSTRALIA
TASMANIA
VICTORIA
WESTERN AUSTRALIA
当我 运行 代码时,return 'NEW SOUTH WALE' 为真,return 'SOUTH AUSTRALI'
为假
为什么 'SOUTH AUSTRALI' return 不正确,因为它包含在 'SOUTH AUSTRALIA' 中?
参考代码如下:
static void Main(string[] args)
{
string[] lines = File.ReadAllLines(@"C:\C# Project\sampledata.dat");
var states = File.ReadAllLines(@"C:\C# Project\States.txt"); //Reads in states
int i = 1;
foreach (string line in lines) //Loops through data
{
if (states.Any(line.Contains))
{
File.AppendAllText(@"C:\C# Project\CorrectAddress.dat",
line + Environment.NewLine);
i++;
}
else
{
File.AppendAllText(@"C:\C# Project\IncorrectAddress.dat",
line + Environment.NewLine);
i++;
}
}
}
您在 foreach 循环中遍历行,因此最终您将获得 s = "SOUTH AUSTRALI"
的值。现在看看你的代码:
if (states.Any(line.Contains))
- 读作 "Does any item in states satisfy the criteria that "SOUTH AUSTRALI" 完全包含它?"
答案当然是否定的,因为您提供的州名没有一个完全适合该字符串。
如果您将该条件更改为:
if (states.Any(x=>x.Contains(line)))
- 现在你在问 "Does any item in states satisfy the criteria that it contains "SOUTH AUSTRALI“它的内部?”。南澳大利亚确实如此,这 return 是预期的结果。
顺便说一句,出于同样的原因,您最初发布的代码对于 "NEW SOUTH WALE" 并不 return 正确。
代码如果替换实际值,您会发现这正是它应该做的:
"SOUTH AUSTRALI".Contains("SOUTH AUSTRALIA")
这显然是错误的。
您正在查找行中包含的 状态 。使用原始数据,以下代码不会打印任何内容,因为没有匹配项:
var lines=new[]{"NEW SOUTH WALE","SOUTH AUSTRALI"};
var states = new[]{"NEW SOUTH WALES","SOUTH AUSTRALIA"};
foreach(var s in lines)
{
if (states.Any(s.Contains))
{
Console.WriteLine(s)
}
}
如果您想找到部分匹配状态的行,您应该反转调用。
foreach(var s in lines)
{
if (states.Any(state=>state.Contains(s)))
{
Console.WriteLine(s)
}
}
这将打印:
NEW SOUTH WALE
SOUTH AUSTRALI
我有一个包含地址的文件,我想检查地址是否正确。我正在将地址与批准的澳大利亚州列表进行比较。
我的地址文件看起来像这样:
NEW SOUTH WALE
N S W 2232
SOUTH AUSTRALI
Victoria
SA 5158
Victoria 3136
Victoria 3029
N.S.W. 2428
我在澳大利亚各州的批准文件是:
NEW SOUTH WALES
QUEENSLAND
SOUTH AUSTRALIA
TASMANIA
VICTORIA
WESTERN AUSTRALIA
当我 运行 代码时,return 'NEW SOUTH WALE' 为真,return 'SOUTH AUSTRALI'
为假为什么 'SOUTH AUSTRALI' return 不正确,因为它包含在 'SOUTH AUSTRALIA' 中?
参考代码如下:
static void Main(string[] args)
{
string[] lines = File.ReadAllLines(@"C:\C# Project\sampledata.dat");
var states = File.ReadAllLines(@"C:\C# Project\States.txt"); //Reads in states
int i = 1;
foreach (string line in lines) //Loops through data
{
if (states.Any(line.Contains))
{
File.AppendAllText(@"C:\C# Project\CorrectAddress.dat",
line + Environment.NewLine);
i++;
}
else
{
File.AppendAllText(@"C:\C# Project\IncorrectAddress.dat",
line + Environment.NewLine);
i++;
}
}
}
您在 foreach 循环中遍历行,因此最终您将获得 s = "SOUTH AUSTRALI"
的值。现在看看你的代码:
if (states.Any(line.Contains))
- 读作 "Does any item in states satisfy the criteria that "SOUTH AUSTRALI" 完全包含它?"
答案当然是否定的,因为您提供的州名没有一个完全适合该字符串。
如果您将该条件更改为:
if (states.Any(x=>x.Contains(line)))
- 现在你在问 "Does any item in states satisfy the criteria that it contains "SOUTH AUSTRALI“它的内部?”。南澳大利亚确实如此,这 return 是预期的结果。
顺便说一句,出于同样的原因,您最初发布的代码对于 "NEW SOUTH WALE" 并不 return 正确。
代码如果替换实际值,您会发现这正是它应该做的:
"SOUTH AUSTRALI".Contains("SOUTH AUSTRALIA")
这显然是错误的。
您正在查找行中包含的 状态 。使用原始数据,以下代码不会打印任何内容,因为没有匹配项:
var lines=new[]{"NEW SOUTH WALE","SOUTH AUSTRALI"};
var states = new[]{"NEW SOUTH WALES","SOUTH AUSTRALIA"};
foreach(var s in lines)
{
if (states.Any(s.Contains))
{
Console.WriteLine(s)
}
}
如果您想找到部分匹配状态的行,您应该反转调用。
foreach(var s in lines)
{
if (states.Any(state=>state.Contains(s)))
{
Console.WriteLine(s)
}
}
这将打印:
NEW SOUTH WALE
SOUTH AUSTRALI