Massive list in c# & wpf

本文关键字:amp wpf list in Massive | 更新日期: 2023-09-27 18:28:42

我有一个由所有美国邮政编码组成的列表,每个邮政编码有3个元素。因此,该列表约为45000 x 3个字符串。加载它的最佳方式是什么,本质上是最高效/优化的?现在我有一个foreach循环在运行它,每次它到达加载点时都会挂起。有更好的方法吗?

编辑

它的用途是让用户能够键入邮政编码,并在另外两个文本框中显示城市和州。现在我已经设置为在用户输入时进行检查,在输入污垢编号后,它会冻结,我相信在ZipCodes代码=新的ZipCodes()

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

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 = "";
            }            
        }
    }

Massive list in c# & wpf

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

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

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

感谢所有的回复,我真的很感激。有几个我并不真正理解,但我知道这是我自己在c#的某些领域缺乏知识。然而,在研究它们的过程中,我确实偶然发现了一个效果很好的不同解决方案,使用了Dictionary<T>而不是List。即使不使用BackgroundWorker,它也能在大约5秒内加载应用程序启动。我以前听说过Dictionary<T>,但直到现在我还没有理由使用/研究它,所以这对我来说是双重的好处。再次感谢所有的帮助!