2010-08-12 65 views
2

我仍试图了解KeyValuePairs,但我相信这个想法应该起作用。在我的代码中,它搜索一个大字符串并提取2个子字符串。一个子字符串(请记住引号之间的值变化)是类似于Identity="EDN\username"另一个子字符串是类似于FrameworkSiteID="Desoto"所以我想在将它们添加到列表之前将这些字符串组合在一起,但这里是我的问题.. 登录下面的字符串是我需要在SQL语句中用来选择SQLServer中的记录的字符串的唯一字段,字符串是我需要与登录字符串对齐的字符串(以及来自SQLServer的所有列和行数据)当我输出这个文本文件。我应该使登录字符串KEYS和framew字符串VALUES?如果是的话,我该怎么做?希望这是有道理的。我还可以解释如果需要的话使用列表<KeyValuePair>存储键和值

Regex reg = new Regex("Identity=\"[^\"]*\""); 
Regex reg1 = new Regex("FrameworkSiteID=\"[^\"]*\""); 

foreach (FileInfo file in Files) 
{ 
    string line = ""; 
    using (StreamReader sr = new StreamReader(file.FullName)) 
    { 
     while (!String.IsNullOrEmpty(line = sr.ReadLine())) 
     { 
      if (line.ToUpper().Contains("IDENTITY=")) 
      { 
       string login = reg.Match(line).Groups[0].Value; 
       string framew = reg1.Match(line).Groups[0].Value; //added 
       IdentityLines.Add(new KeyValuePair<string, string>(file.Name, login + " " + framew)); 
        //This is probably not what I need 
      } 


      else 
      { 
       IdentityLines.Add(new KeyValuePair<string, string>(file.Name, "NO LOGIN")); 
      } 
     } 

回答

1

我很清楚这是什么目的。您似乎没有将KeyValuePair作为Key和Value对使用。你是否将它们用作一般配对课程?这是一个合理的使用(我自己这样做),但我不知道你在寻求什么帮助。

KeyValuePair的预期用途是作为字典实现中的助手类。如果你打算根据一个关键字来查找值,这将会很有用,尽管从你的解释看来你并不是这样。

为什么你使用文件名作为关键?有关系吗?

我也看不出为什么你将所有这些东西加载到列表中。为什么不把它们放出来并在发现它们时使用它们?

foreach (FileInfo file in Files) 
{ 
    using (StreamReader sr = new StreamReader(file.FullName)) 
    { 
     for(string line = sr.ReadLine(); !string.IsNullOrEmpty(line); line = sr.ReadLine()) 
     { 
      if(line.IndexOf("IDENTITY=", StringComparison.InvariantCultureIgnoreCase) != -1) 
      { 
       string login = reg.Match(line).Groups[0].Value; 
       string framew = reg1.Match(line).Groups[0].Value; //added 
       yield return new KeyValuePair<string, string>(login, framew)); 
      } 
     } 
    } 
} 

在另一方面,如果你想使用它们作为关键d值:

Dictionary<string, string> logins = new Dictionary<string, string>(); 
foreach (FileInfo file in Files) 
{ 
    using (StreamReader sr = new StreamReader(file.FullName)) 
    { 
     for(string line = sr.ReadLine(); !string.IsNullOrEmpty(line); line = sr.ReadLine()) 
     { 
      if(line.IndexOf("IDENTITY=", StringComparison.InvariantCultureIgnoreCase) != -1) 
      { 
       string login = reg.Match(line).Groups[0].Value; 
       string framew = reg1.Match(line).Groups[0].Value; //added 
       logins.Add(login, framew)); 
      } 
     } 
    } 
} 

现在登录[登录]返回相关的框架原理。如果你想这是不区分大小写的,那么酌情使用new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase)

最后,你确定没有空白的喜欢,直到文件的结尾?如果可能的话,应该使用line != null而不是!string.IsNullOrEmpty()来避免过早地停止读取文件。

+0

嗨乔恩 - 我不认为它是重要的,我使用文件名作为关键,我不认为会有任何空白行。我拥有的是数千行XML日志,每行都有这些巨大的字符串。我只需要提取或解析用户标识(Identity)和框架siteid的位置。这有帮助吗?问题在于用户可能会多次出现在日志中,因此一旦添加完成,我需要跳过它。我怎样才能使用你最后的功能呢? – Josh 2010-08-13 12:56:31

+1

无关紧要的关键不是关键。它确实听起来像你想用用户名作为关键,并使用我给出的最后一个例子,但替换登录。添加与'登录[登录] = framew',这将添加如果没有一个和覆盖if有每个用户输入一次的结果。 我会让它应付空白行,除非空行实际上意味着它应该停止在那一点;它会更安全。 – 2010-08-13 13:11:04

+0

感谢乔恩,我认为这工作。现在我已经将userid和frameworksiteid存储在名为logins的Dictionary中了,如何循环这个dictonary并移除特殊字符?我有一个函数,它接受一个字符串并删除特殊字符,但我只需要知道如何设置循环。 – Josh 2010-08-13 13:20:57

5

KeyValuePair<TKey,TValue>是由Dictionary<TKey,TValue>类中使用的结构。而不是保留一个KeyValuePair<TKey,TValue>对象的列表,只需创建一个Dictionary<TKey,TValue>并向其添加键/值。

实施例:

Dictionary<string,string> identityLines = new Dictionary<string,string>(); 
foreach (FileInfo file in Files) 
{ 
    string line = ""; 
    using (StreamReader sr = new StreamReader(file.FullName)) 
    { 
     while (!String.IsNullOrEmpty(line = sr.ReadLine())) 
     { 
      if (line.ToUpper().Contains("IDENTITY=")) 
      { 
       string login = reg.Match(line).Groups[0].Value; 
       string framew = reg1.Match(line).Groups[0].Value; //added 
       identityLines.Add(login, framew); 
      } 
     } 
    } 
} 

这将创建登录名和framews之间的关联。如果您想按文件对这些文件进行排序,您可以制作一个Dictionary<string, Dictionary<string,string>>并将每个identityLines字典与特定的文件名相关联。请注意,Dictionary<TKey, TValue>类型的键值是唯一的 - 如果您尝试添加已添加的键,则会出现错误。

+0

+1为使用块 – 2010-08-12 21:26:08

+0

嗨杰克 - 你提到,如果我遇到一个已经添加的值,我会得到一个错误,所以我怎么解决这个问题?有很多次我遇到了已经添加的值。谢谢杰克 – Josh 2010-08-13 12:38:19

+0

@Josh你可以让你的字典保存'List '对象而不是'TValue'对象,然后你可以有多个与同一个键相关联的值。 – Jake 2010-08-13 17:43:31