我有一个包含地址的文件,我想检查地址是否正确。我将地址与澳大利亚批准的州名单进行比较。
我的地址文件如下所示:
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
当我运行代码时,它将返回true,因为“NEW SOUTH WALE'但是对于南澳大利亚州来说,它会返回错误的
为什么南澳大利亚'因为它包含在“南澳大利亚”中。 ?
以下是供参考的代码:
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++;
}
}
}
答案 0 :(得分:1)
您正在迭代foreach循环中的行,因此最终,您的值为s = "SOUTH AUSTRALI"
。现在看看你的代码:
if (states.Any(line.Contains))
- 其内容为"州内的任何项目是否满足" SOUTH AUSTRALI"完全包含它?"
答案当然是否定的,因为您提供的州名并不完全符合该字符串。
如果您将该条件更改为:
if (states.Any(x=>x.Contains(line)))
- 现在你要问"州内的任何项目是否满足它所包含的标准"南澳大利亚"在其内部?"。南澳大利亚确实如此,这将返回预期的结果。
顺便说一句,由于同样的原因,您最初发布的代码并不会因为#SOUTH; NEW SOUTH WALE"而返回。
答案 1 :(得分:1)
代码如果你替换实际值,你会发现这正是它应该做的:
"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