比较字符串和变量但基于contains失败

时间:2010-06-23 13:57:24

标签: c#

我发生的事情是我有两个文件。两个文件都以“|”分隔。如果文件1与文件2中的一行匹配,我需要组合这些行。这是代码:

   string[] mathlines = File.ReadAllLines(@"C:\math.txt");
   var addlines = File.ReadAllLines(@"K:\add.txt");
   foreach (string ml in mathlines)
   {
       string[] parse = ml.Split('|');
       if (addlines.Contains(parse[0]))
       {
           File.AppendAllText(@"C:\final.txt", parse[0]+"|"+parse[1]+"\n");
       }
       else
       {
           File.AppendAllText(@"C:\final.txt", ml + "\n");
       }
   }

我意识到数学部分尚未设置,但我需要让匹配部分正常工作。

以下是一个例子:

mathlines:

dart|504.91  
GI|1782.06  
Gcel|194.52  
clay|437.35  
grado|217.77  
greGCR|14.82  
rp|372.54  
rp2|11.92  
gsg|349.92  
GSxil|4520.55 

addlines:

Gimet|13768994304  
GSxil|394735896576  
Ho|4994967296  
gen|485331304448  
GSctal|23482733690  
Obr|88899345920

正如您所看到的,mathlines包含GSxil,addlines也是如此,但我的if (addlines.Contains)从不对addlines中的变量进行罚款。任何帮助总是被爱!感谢。

抱歉忘了提到我需要它才能完全匹配比较。此外,我需要在匹配的正确行上拆分变量。所以我需要拆分394735896576这个例子,然后追加394735896576。

2 个答案:

答案 0 :(得分:2)

addLines.Contains(parse[0])将匹配整个字符串;你需要根据部分匹配。有更高效的解决方案,但O(n ^ 2)选项是使用LINQ Any()

if (addLines.Any(l => l.StartsWith(parse[0])))
{
...

答案 1 :(得分:0)

您可以将addlines.txt中的所有行加载到字典中,然后使用它来查找mathlines.txt中每行的匹配项。这种方法比你目前的方法快得多。

string[] mathlines = File.ReadAllLines(@"C:\math.txt");
string[] addlines = File.ReadAllLines(@"K:\addlines.txt");
string[] finallines = new string[mathlines.Length];
var addlinesLookup = new Dictionary<string, string>();
for (int i = 0; i < addlines.Length; i++)
{
  string[] parts = addlines[i].Split('|');
  if (parts.Length == 2) // Will there ever be more than 2 parts?
  {
    addlinesLookup.Add(parts[0], parts[1]);
  }
}
for (int i = 0; i < mathlines.Length; i++)
{
  string[] parts = mathlines[i].Split('|');
  if (parts.Length >= 1)
  {
    if (addlinesLookup.ContainsKey(parts[0]))
    {
      finallines[i] = mathlines[i] + "|" + addlinesLookup[parts[0]] + "\n";
    }
    {
      finallines[i] = mathlines[i] + "\n";
    }
  }
}
File.AppendAllLines(@"C:\final.txt", finallines, Encoding.ASCII);