使用List <keyvaluepair>存储键和值</keyvaluepair>

时间:2010-08-12 21:05:42

标签: c#

我仍在努力理解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"));
            }
        }

2 个答案:

答案 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()来避免过早停止文件读取。