我仍在努力理解KeyValuePairs
,但我相信这个想法应该有效。在我的下面的代码中,它搜索一个大字符串并提取2个子字符串。一个子字符串(请记住引号之间的值不同)类似于Identity="EDN\username"
另一个子字符串类似于FrameworkSiteID="Desoto"
所以我在考虑将这些字符串组合在一起然后将它们添加到List中,但这里是我的问题..下面的登录字符串是一个字符串的唯一字段,我需要在SQL语句中使用它来选择SQLServer中的记录, framew 字符串是我需要的字符串当我将其输出到文本文件时,与登录字符串(以及来自SQLServer的所有数据列和行)对齐。我应该使登录字符串KEYS和framew字符串VALUES?如果是这样我该怎么做?希望有道理。我可以进一步解释是否需要
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"));
}
}
答案 0 :(得分: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>
类型的键值是唯一的 - 如果您尝试添加已添加的键,则会出现错误。
答案 1 :(得分:1)
我清楚地注意到这是什么目的。您似乎没有将KeyValuePairs用作Key和Value的对。你使用它们作为一般配对吗?这是一个合理的用途(我自己这样做),但我不确定你在寻求什么帮助。
KeyValuePair的预期目的是作为Dictionaries实现中的辅助类。如果您要根据键来查找值,这将非常有用,尽管从您的解释中看起来并不是这样。
为什么使用文件名作为密钥?这有关系吗?
我也不明白为什么要将所有这些内容加载到列表中。为什么不放弃它们并在发现它们时使用它们呢?
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));
}
}
}
}
现在登录[login]返回相关的framew。如果您希望此不区分大小写,请根据需要使用new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
或new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase)
。
最后,你确定在文件结束之前不会有空白的喜欢吗?如果可能,您应该使用line != null
而不是!string.IsNullOrEmpty()
来避免过早停止文件读取。