Массивный список в c # & wpf - PullRequest
0 голосов
/ 22 марта 2012

У меня есть список, состоящий из всех почтовых индексов США, каждый из которых состоит из 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 ]

3 голосов
/ 22 марта 2012

Существует несколько опций, которые зависят от вашего варианта использования и целевых клиентских компьютеров.

  1. Используйте постраничные элементы управления.Используйте существующие варианты постраничного управления (например, telerik), которые поддерживают подкачку.Таким образом, вы будете иметь дело с меньшим подмножеством доступных данных.
  2. Используйте элементы управления поиском / фильтром.Заставьте пользователей вводить частичные данные, чтобы уменьшить размер данных, которые вам нужно показать.
  3. Использование наблюдаемого сбора данных приведет к проблемам с производительностью, так как класс, предоставленный платформой, не поддерживает массовую загрузку.Создайте свою собственную наблюдаемую коллекцию, которая поддерживает массовую загрузку (которая не вызывает событие изменения коллекции для каждого добавляемого элемента).В списке из 5-10 000 членов я видел время загрузки, уменьшенное с 3 с до 0,03 с.
  4. Использование асинхронных операций при загрузке данных из базы данных.Таким образом, пользовательский интерфейс остается отзывчивым, и у вас есть возможность информировать пользователей о текущей операции.Это значительно улучшает воспринимаемую производительность.
0 голосов
/ 23 марта 2012

Спасибо за все ответы, я действительно ценю их.Пара, которую я на самом деле не понимал, но я знаю, что это мой недостаток знаний в определенных областях c #.Исследуя их, я наткнулся на другое решение, которое прекрасно работало, используя Dictionary<T> вместо List.Даже без использования BackgroundWorker, он загружается при запуске приложения примерно через 5 секунд.Я слышал о Dictionary<T> раньше, но до сих пор никогда не было причины использовать / исследовать его, так что это было вдвойне полезно для меня.Еще раз спасибо за всю помощь!

0 голосов
/ 22 марта 2012

Вместо загрузки всех элементов, попробуйте загрузить по требованию. Например, когда пользователь вводит первые три буквы, запрашивает список и возвращает только совпадающие элементы. Для этого существует множество элементов управления как в silverlight, так и в ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...