2012-02-16 78 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