c#&中的大量列表WPF

时间:2012-03-22 07:19:06

标签: c# wpf list optimization

我有一个包含所有美国邮政编码的清单,每个邮政编码包含3个元素。因此列表是~45,000 x 3个字符串。加载它的最佳方法是什么,基本上是最有效/优化的?现在我有一个foreach循环运行它,每次它到达加载点就会挂起。有更好的方法吗?

修改

使用此方法是为了让用户能够输入邮政编码并将城市和州显示在另外两个文本框中。现在我把它设置为检查用户类型,输入污垢号后冻结,我相信ZipCodes代码=新ZipCodes()

这是我目前正在使用的代码。我留下了其中一个zipCode.Add语句,但删除了另外一个44,999。

struct ZipCode
{
    private String cvZipCode;
    private String cvCity;
    private String cvState;

    public string ZipCodeID { get { return cvZipCode; } }
    public string City { get { return cvCity; } }
    public string State { get { return cvState; } }

    public ZipCode(string zipCode, string city, string state)
    {
        cvZipCode = zipCode;
        cvCity = city;
        cvState = state;
    }

    public override string ToString()
    {
        return City.ToString() + ", " + State.ToString();
    }
}

class ZipCodes
{
    private List<ZipCode> zipCodes = new List<ZipCode>();
    public ZipCodes()
    {            
        zipCodes.Add(new ZipCode("97475","SPRINGFIELD","OR"));            
    }

    public IEnumerable<ZipCode> GetLocation()
    {
        return zipCodes;
    }
    public IEnumerable<ZipCode> GetLocationZipCode(string zipCode)
    {
        return zipCodes;
    }
    public IEnumerable<ZipCode> GetLocationCities(string city)
    {
        return zipCodes;
    }
    public IEnumerable<ZipCode> GetLocationStates(string state)
    {
        return zipCodes;
    }
}

private void LocateZipCode(TextBox source, TextBox destination, TextBox destination2 = null)
    {
        ZipCodes zips = new ZipCodes();
        string tempZipCode;
        List<ZipCode> zipCodes = new List<ZipCode>();

        try
        {
            if (source.Text.Length == 5)
            {
                tempZipCode = source.Text.Substring(0, 5);

                dataWorker.RunWorkerAsync();

                destination.Text = zipCodes.Find(searchZipCode => searchZipCode.ZipCodeID == tempZipCode).City.ToString();
                if (destination2.Text != null)
                {
                    destination2.Text = zipCodes.Find(searchZipCode => searchZipCode.ZipCodeID == tempZipCode).State.ToString();
                }
            }
            else destination2.Text = "";
        }
        catch (NullReferenceException)
        {
            destination.Text = "Invalid Zip Code";
            if (destination2 != null)
            {
                destination2.Text = "";
            }            
        }
    }

3 个答案:

答案 0 :(得分:3)

有几个选项取决于您的用例和目标客户端计算机。

  1. 使用分页控件。使用支持分页的现有分页控件变体(例如telerik)。这样您就可以处理较小的可用数据子集。
  2. 使用搜索/过滤器控件。强制用户输入部分数据以减少需要显示的数据大小。
  3. 使用observable collection会导致性能问题,因为框架提供的类不支持批量加载。制作您自己的可观察集合,该集合支持批量加载(不会在您添加的每个元素上引发集合更改事件)。在5-10.000名成员的名单上,我看到加载时间从3s减少到0.03s。
  4. 从db加载数据时使用异步操作。这种方式UI保持响应,您有机会通知用户当前操作。这极大地改善了感知性能。

答案 1 :(得分:0)

不是加载所有项目,而是尝试按需加载。例如,当用户输入前三个字母然后查询列表并仅返回匹配的项目。在silverlight和ajax中都存在许多用于此目的的控件。

答案 2 :(得分:0)

感谢所有回复,我真的很感激他们。一对我真的不明白,但我知道这是我自己在c#的某些方面缺乏知识。在研究它们的过程中,我偶然发现了一个使用Dictionary<T>代替List的漂亮工作的不同解决方案。即使不使用BackgroundWorker,它也会在大约5秒钟内启动应用启动。我之前听说过Dictionary<T>,但直到现在从未有过使用/研究它的原因,所以这对我来说是双重益处。再次感谢所有的帮助!