2012-02-16 65 views
1

我想用key-> postal和value-> city构建一个组合框,作为我的住宿的过滤器。从查询中获取唯一值生成字典

要限制列表中项目的数量,我只使用填充表tblAccomodations时使用的邮政编码。 现在我不使用与邮政和城市的关系表,虽然我在后面考虑更新。

在这里,我建我的字典:

public static Dictionary<int, string> getPostals() 
{ 
    Dictionary<int, string> oPostals = new Dictionary<int, string>(); 

    using (DBReservationDataContext oReservation = new DBReservationDataContext()) 
    { 
     var oAllPostals = (from oAccomodation in oReservation.tblAccomodations 
          orderby oAccomodation.Name ascending 
          select oAccomodation); 

     foreach (tblAccomodation item in oAllPostals) 
     { 
      oPostals.Add(int.Parse(item.Postal), item.City); 
     } 
    } 
    return oPostals; 
} 

正如预期的那样我得到了一个错误:有些住宿地都位于同一个城市,所以有关键双重价值。那么,我怎样才能得到一个独特的城市和邮政名单(作为关键)? 我试图用

select oAccomodation.Postal.Distinct() 

但也不能工作。

更新:我发现了主要问题。有多个城市具有相同的邮政(“子城市”)。所以我要过滤“城市”而不是“邮政”。

回答

1

我认为你在寻找'不同'。收集所有邮件的列表,然后返回myPostals.Distinct()。

希望比帮助。

+0

我的确在用Distinct()尝试,但那也没用。现在我已经看到了问题所在。有些城市有同样的邮寄地址,我认为这些邮件已经崩溃了。 – bflydesign 2012-02-16 10:50:41

1

变化

foreach (tblAccomodation item in oAllPostals) 
     { 
      oPostals.Add(int.Parse(item.Postal), item.City); 
     } 

foreach (tblAccomodation item in oAllPostals.Distinct(x=>x..Postal) 
      { 
if(!oPostals.ContainsKey(int.Parse(item.Postal))) 
       oPostals.Add(int.Parse(item.Postal), item.City); 
      } 
1

顺便说一句,如果你在一个邮政有多个城市(我不知道是否有可能在您的域名),你想看看哪一个?

如果有城市会做的,那么它是轻松获取每个邮政第一个:

var oAllPostals = oReservation.tblAccomodations 
         .OrderBy(x=>x.Name) 
         .ToLookup(x=>x.Postal, x=>x.City) 
         .ToDictionary(x=>x.Key, x.First()); 

在同样的例子,如果你做.ToList()或者甚至.Distinct().ToList()代替.First()你将拥有所有的在Dictionary<Postal, List<City>>字典中的城市。

+0

确实是这个问题。我有多个城市邮政相同。让他们全部都是重要的,所以我不能使用邮政作为关键。 – bflydesign 2012-02-16 10:54:29

1

使用.containkey将排除[1(邮政钥匙)到n(城市关系)]。即由于密钥已经存在,下一个城市(具有相同的邮政密钥)将不会进入您的字典。

但是,如果你想你的映射到邮政的城市名单,你可以代表可以包含值的集合类似下面的词典:

Dictionary < String[Postal]> , List < Cities>> 

这样就会有一本字典你可以有多个值。

1

假设邮政+城市的组合是唯一的,你可以做到以下几点:

public static Dictionary<int, string> getPostals() 
{ 
    Dictionary<int, string> oPostals = new Dictionary<int, string>(); 

    using (DBReservationDataContext oReservation = new DBReservationDataContext()) 
    { 
     var oAllPostals = (from oAccomodation in oReservation.tblAccomodations 
          orderby oAccomodation.Name ascending 
          select oAccomodation); 

     foreach (tblAccomodation item in oAllPostals) 
     { 
      oPostals.Add((item.Postal + item.City).GetHashCode(), item.Postal + " " + item.City); 
     } 
    } 
    return oPostals; 
} 

编辑:

如果你想从下拉框中使用所选的值,那么你可以使用下面的:

public static Dictionary<int, Tuple<string, string>> getPostals() 
{ 
    Dictionary<int, string> oPostals = new Dictionary<int, string>(); 

    using (DBReservationDataContext oReservation = new DBReservationDataContext()) 
    { 
     var oAllPostals = (from oAccomodation in oReservation.tblAccomodations 
          orderby oAccomodation.Name ascending 
          select oAccomodation); 

     foreach (tblAccomodation item in oAllPostals) 
     { 
      oPostals.Add((item.Postal + item.City).GetHashCode(), new Tuple<string, string>(item.Postal, item.City)); 
     } 
    } 
    return oPostals; 
} 

你下面绑定的方式取决于您是否使用asp.net,的WinForms等这里的an example for winforms

+1

每个邮政都有多个城市,但组合确实是独一无二的。我想GetHashCode会给你一个唯一的int作为结果。但是,我怎么能在我的过滤器中实现呢?这不再是邮政。 – bflydesign 2012-02-16 10:57:18