使用List,Lookup或Dictionary来获取大量数据

Mar*_*ram 6 c# lookup dictionary list

我的类库中有一个名为Lookup的静态类,我使用这个类来查找不同的值(在本例中为Locations).

这些值可以达到数百个.由于95%的客户在没有Internet访问权限的计算机上安装我的应用程序,因此我必须假设我的应用程序无法访问Internet或访问数据库.

所以我想知道这是否是一种有效的处理方法,如果我在方法完成后正确处理对象:

代码:

using System;
using System.Collections.Generic;

namespace FunctionLibrary
{
    public static class Lookups
    {
        private static List<Vers> Versions;

        public static string GetVersion(string s)
        {
            string retValue = string.Empty;
            Versions = new List<Vers>();

            try
            {
                if (s.Trim().Length > 0)
                {

                    GetVersions();
                    retValue = Versions.Find(ver => ver.VersionNumber == s).VersionLiteral;

                    if (string.IsNullOrEmpty(retValue))
                    {
                        retValue = string.Format("{0} is an Unknown Version Number", s);
                    }
                }
                else
                {
                    retValue = "No version number supplied";
                }
            }
            catch
            {
                retValue = string.Format("{0} is an Unknown Version Number", s);
            }
            finally
            {
                Versions.Clear();
                Versions = null;
            }
            return retValue;
        }

        private static void GetVersions()
        {
            Versions.Add(new Vers() { VersionNumber = "0000", VersionLiteral = "Location 1" });
            Versions.Add(new Vers() { VersionNumber = "0001", VersionLiteral = "Location 2" });
            Versions.Add(new Vers() { VersionNumber = "0002", VersionLiteral = "Location 3"});
            Versions.Add(new Vers() { VersionNumber = "0003", VersionLiteral = "Location 4"});
            Versions.Add(new Vers() { VersionNumber = "0004", VersionLiteral = "Location 5"});
            Versions.Add(new Vers() { VersionNumber = "0005", VersionLiteral = "Location 6"});
            Versions.Add(new Vers() { VersionNumber = "0006", VersionLiteral = "Location 7"});
            Versions.Add(new Vers() { VersionNumber = "0007", VersionLiteral = "Location 8"});
        }
    }

    public class Vers
    {

        public string VersionLiteral { get; set; }
        public string VersionNumber { get; set; }
   }
}
Run Code Online (Sandbox Code Playgroud)

我也想知道我是否应该使用Dictionary或Lookup而不是列表.我只是不希望多次调用此方法导致内存问题.

Ada*_*dam 16

要进行更全面的评估,您可能需要考虑codereview.SE.


关于List<T>vs Dictionary<TKey, TValue>vs的一些一般性说明Lookup<TKey, TElement>

正如其他答案所示,在您的场景中使用List非常糟糕,主要是因为查找元素会有不良表现.

之间进行选择DictionaryLookup不是硬(从MSDN,重点煤矿):

Lookup<TKey, TElement>类似于一个Dictionary<TKey, TValue>.不同的是
,一个Dictionary<TKey, TValue>键映射到单个值,而 Lookup<TKey, TElement>将键映射到值集合.

您可以Lookup<TKey, TElement>通过调用ToLookup 实现的对象来创建a的实例IEnumerable<T>.

由于您只需要将键映射到单个值,因此a Dictionary是正确的选择.


以前接受的答案是正确的方向迈出的一步,但仍然得到几个关键的事情错(编辑:这些问题已经得到了解决).

字符串是不可变的: s.Trim()不会改变s- 如果你之后使用它,它将返回string你需要的新含义,你就是这样.s = s.Trim()s

静态类不能有实例构造函数:public Lookups()应该是static Lookups()(静态构造函数不允许有访问修饰符 - 当然).

不要将空字符串/错误消息作为字符串返回!

这将成为一个奇妙的调试头痛.你应该使用Exceptions而不是传递错误字符串 - 你应该提供一种VersionExists方法来检查你的字典是否包含某个版本!

修改,更安全的例子

FormatException如果参数为空,null或空格,则抛出一个if.如果版本不存在,那么Dictionary会抛出一个KeyNotFoundException- 比调试更有帮助string.Empty,你不觉得吗?

public static class Lookups
{
    private static Dictionary<string, Vers> Versions;

    static Lookups()
    {
        Versions = new Dictionary<string, Vers>
        {
            {"0000", new Vers {VersionNumber = "0000", VersionLiteral = "Location 1"}},
            {"0001", new Vers {VersionNumber = "0001", VersionLiteral = "Location 2"}},
            {"0002", new Vers {VersionNumber = "0002", VersionLiteral = "Location 3"}},
            {"0003", new Vers {VersionNumber = "0003", VersionLiteral = "Location 4"}},
            {"0004", new Vers {VersionNumber = "0004", VersionLiteral = "Location 5"}},
            {"0005", new Vers {VersionNumber = "0005", VersionLiteral = "Location 6"}},
            {"0006", new Vers {VersionNumber = "0006", VersionLiteral = "Location 7"}},
            {"0007", new Vers {VersionNumber = "0007", VersionLiteral = "Location 8"}}
        };
    }

    public static bool VersionExists(string versionNumber)
    {
        return Versions.ContainsKey(versionNumber);
    }

    public static string GetVersion(string s)
    {
        if (string.IsNullOrWhiteSpace(s)) 
            throw new FormatException("Empty version number!");
        return Versions[s.Trim()].VersionLiteral;
    }
}
Run Code Online (Sandbox Code Playgroud)