使用FindAll而不是Find

时间:2013-11-07 23:26:35

标签: c# lambda find findall

我正在开发一个程序,其中(除其他外)将通过邮政编码找到任何美国城市,或者按城市查找任何邮政编码。我有一个存储在.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.List 1 [MyConvert.formLookup + City]`。 / p>

有没有更好的方法可以返回与特定城市相关的所有邮政编码?

如果它有用,如果我尝试包含.ZipCode,我得到的确切错误是:

  

错误1 'System.Collections.Generic.List<MyConvert.formLookup.City>'不包含'ZipCode'的定义,并且没有扩展方法'ZipCode'接受类型'System.Collections.Generic.List'的第一个参数可以找到(你是否错过了使用指令或汇编参考?)“

2 个答案:

答案 0 :(得分:1)

因为,您现在有多个zipcodes尝试首先转换为列表 -

txtZipcode.Text = String.Join(",", cities.FindAll(s => (s.Name == txtCity.Text.Split(',')[0])).Select(s=>s.Zipcode.ToString() ));

答案 1 :(得分:1)

这样的东西
var sought = txtCity.Text.Split(',')[0];
string.Join(",", cities.FindAll( s => s.Name == sought ).Select(zi => zi.ZipCode.ToString()));