Использование FindAll вместо Find

Я работаю над программой, которая (среди прочего) найдет любой город США по почтовому индексу или найдет любой почтовый индекс по городу. У меня есть информация о почтовом индексе и городе, хранящаяся в .csv, и я успешно извлекаю эти данные и сохраняю их.

Как видно из приведенного ниже кода, прямо сейчас я нахожу первый City, с которым связан конкретный почтовый индекс (последняя строка кода):

class City
{
    public string Name { get; set; }
    public int ZipCode { get; set; }
    public string State { get; set; }
}

private void btnConvert2City_Click(object sender, EventArgs e)
{
    try
    {
        Boolean firstLoop = true;
        string dir = System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().Location);

        string path = dir + @"\zip_code_database_edited.csv";
        var open = new StreamReader(File.OpenRead(path));

        List<City> cities = new List<City>();
        foreach (String s in File.ReadAllLines(path))
        {
            if (firstLoop)
            {
                firstLoop = false;
                continue;
            }

            City temp = new City();
            temp.ZipCode = int.Parse(s.Split(',')[0]);
            temp.Name = s.Split(',')[1];
            temp.State = s.Split(',')[2];
            cities.Add(temp);
        }

        txtCity.Text = cities
            .Find(s => s.ZipCode == Int32.Parse(txtZipcode.Text))
            .Name;

Этот метод отлично подходит для возврата города, однако, когда пользователь выполняет поиск по городу, программа должна возвращать МНОЖЕСТВО почтовых индексов. В настоящее время мой код для этого процесса выглядит следующим образом:

txtZipcode.Text = cities
    .Find(s => (s.Name == txtCity.Text.Split(',')[0]))
    .ZipCode
    .ToString();

Будучи новичком в C#, я решил, что могу изменить cities.Find на cities.FindAll. Однако, когда я это делаю, мне не разрешается включать .ZipCode, а с удаленным .ZipCode программа возвращает System.Collections.Generic.List1[MyConvert.formLookup+City]` в текстовом поле.

Есть ли лучшие способы вернуть все почтовые индексы, связанные с определенным городом?

Если это полезно, точная ошибка, которую я получаю, если пытаюсь включить .ZipCode:

Ошибка 1 'System.Collections.Generic.List<MyConvert.formLookup.City>' не содержит определения для «ZipCode», и не удалось найти метод расширения «ZipCode», принимающий первый аргумент типа «System.Collections.Generic.List» (вам не хватает директивы using или ссылки на сборку?) "


person Mark P.    schedule 07.11.2013    source источник
comment
Также нет причин вызывать s.Split(',') три раза, просто сохраните результат в переменной.   -  person Ben Voigt    schedule 08.11.2013


Ответы (2)


Что-то типа

var sought = txtCity.Text.Split(',')[0];
string.Join(",", cities.FindAll( s => s.Name == sought ).Select(zi => zi.ZipCode.ToString()));
person Ben Voigt    schedule 07.11.2013
comment
Это прекрасно работает. Спасибо. Для справки, почему FindAll не работает с .ZipCode, как Find? - person Mark P.; 08.11.2013
comment
Поскольку FindAll возвращает список msdn.microsoft.com/ en-us/library/fh1w7y8z(v=vs.110).aspx - person Vishal; 08.11.2013

Поскольку у вас есть несколько почтовых индексов, попробуйте сначала преобразовать их в список -

txtZipcode.Text = String.Join(",", cities.FindAll(s => (s.Name == txtCity.Text.Split(',')[0])).Select(s=>s.Zipcode.ToString() ));
person Vishal    schedule 07.11.2013
comment
да обновленный действительно не нужен выбор. Мне пора домой, думаю, ты меня все равно опередил :) - person Vishal; 08.11.2013
comment
Я бы так не сказал. У вас есть обе основные части, Select и Join. - person Ben Voigt; 08.11.2013
comment
Спасибо за все быстрые ответы. Для этого кода я все еще получаю ту же ошибку, что и раньше, с последним .ZipCode. - person Mark P.; 08.11.2013
comment
Если бы я мог выбрать два ответа, я бы выбрал. Спасибо за вашу помощь! - person Mark P.; 08.11.2013