开发者

Using List<KeyValuePair> to store Keys and Values

I'm still trying to understand KeyValuePairs but I believe this idea should work. In my code below it searchs through a large string and extracts 2 substrings. One substring (keep in mind the value between the quotes varies) is something like Identity="EDN\username" another substring is something like FrameworkSiteID="Desoto" So I was thinking about combining these strings together before I added them to the List but here is my problem.. The login string below is a Unique field of strings that I need to use in a SQL statement to select records in SQLServer and the framew strings are strings I need lined up with the login strings (and all the columns and rows of data coming from SQLServer) when I output this to a text file. Should I make the login strings KEYS and the framew strings VALUES? If so how do I do that?? Hope that makes sense. I can further explain if needs be

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 pro开发者_运维技巧bably not what I need
            }


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


KeyValuePair<TKey,TValue> is a structure used by the Dictionary<TKey,TValue> class. Instead of keeping a list of KeyValuePair<TKey,TValue> objects, just create a Dictionary<TKey,TValue> and add keys/values to it.

Example:

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);
            }
        }
    }
}

This will create an association between logins and framews. If you want to sort these by file, you can make a Dictionary<string, Dictionary<string,string>> and associate each identityLines dictionary with a specific filename. Note that the key values of the Dictionary<TKey, TValue> type are unique - you will get an error if you try to add a key that has already been added.


I'm note clear what the purpose of this is. You don't seem to be using the KeyValuePairs as pairs of a Key and a Value. Are you using them as a general pair class? It's a reasonable use (I do this myself), but I'm not sure what help you are seeking.

The intended purpose of KeyValuePair is as a helper-class in the implementation of Dictionaries. This would be useful if you are going to look up values based on having a key, though it doesn't seem from your explanation that you are.

Why are you using the filename as the key? Does it matter?

I also don't see why you are loading all of this stuff into a list. Why not just yield them out and use them as they are found?

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));
            }
        }
    }
}

On the other hand, if you do want to use them as key-d values:

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));
            }
        }
    }
}

Now logins[login] returns the related framew. If you want this to be case-insensitive then use new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) or new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase) as appropriate.

Finally, are you sure there will be no blank likes until the end of the file? If there could be you should use line != null rather than !string.IsNullOrEmpty() to avoid stopping your file read prematurely.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜