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