2012-02-16 9 views
1

キー - >郵便番号と値 - >都市のコンボボックスを作成して、私の宿泊施設のフィルタとして使用したいと考えています。ビルドするクエリから一意の値を取得する

リスト内のアイテムの数を制限するために、私はテーブルtblAccomodationsを埋めるときに使用した郵便物のみを使用します。 私は後で更新について考えていますが、私は郵便と都市のリレーショナルテーブルを使用しません。

ここ

私は私の辞書を構築する:いくつかのAccomodationsは、同じ都市に位置しているので、キーの二重の値があります

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

あなたは「Distinct」を探していると思います。すべての郵便物のリストを収集し、myPostals.Distinct()を返します。

希望よりも。

+0

私は本当にDistinct()で試していましたが、どちらもうまくいきませんでした。今私は問題が何かを見てきました。同じ郵便を持っている都市があり、私はそれが崩壊したと思う。 – bflydesign

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

に、あなたが見たいと思って1、(私はそれがあなたのドメインで可能であるかどうかわからないです) ?

都市のいずれかが行います場合は、それはちょうど郵便につき最初の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

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、リサイズなどを使用しているかどうかに依存しては、ここでan example for winformsです。

+1

あなたは郵便ごとに複数の都市を持っていますが、組み合わせは本当にユニークです。 GetHashCodeは結果として一意のintを返すと思います。しかし、私はそれを私のフィルターにどのように実装できますか?それはもはや郵便ではありません。 – bflydesign

関連する問題