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 = "";
}
}
}
有几个选项取决于您的用例和目标客户端机器。
- 使用分页控件。使用支持寻呼的现有寻呼控制变体(例如telerik)。通过这种方式,您将处理可用数据的较小子集
- 使用搜索/筛选控件。强制用户输入部分数据,以减小需要显示的数据的大小
- 使用可观察的集合将导致性能问题,因为框架提供的类不支持大容量加载。制作您自己的可观察集合,该集合支持批量加载(不会在您添加的每个元素上引发集合更改事件)。在5-10000名成员的列表中,我看到加载时间从3秒减少到0.03秒
- 从数据库加载数据时使用异步操作。通过这种方式,UI保持响应,您有机会向用户通知当前操作。这极大地提高了感知性能
不要加载所有项目,而是尝试按需加载。例如,当用户输入前三个字母时,查询列表并只返回匹配的项目。silverlight和ajax中都存在许多用于此目的的控件。
感谢所有的回复,我真的很感激。有几个我并不真正理解,但我知道这是我自己在c#的某些领域缺乏知识。然而,在研究它们的过程中,我确实偶然发现了一个效果很好的不同解决方案,使用了Dictionary<T>
而不是List。即使不使用BackgroundWorker
,它也能在大约5秒内加载应用程序启动。我以前听说过Dictionary<T>
,但直到现在我还没有理由使用/研究它,所以这对我来说是双重的好处。再次感谢所有的帮助!