2011-06-16 54 views
0

具備以下條件:LINQ的加入問題

class Hal 
{ 
    public int zip { get; set; } 
    public string Phone { get; set; } 
    ... 
} 

List<Hal> data; 
Dictionary<int, List<int>> zipList; 

zipList - 關鍵是「拉鍊」 - 值是相關的「拉鍊」的集合

要選擇具有「全「哈爾」對象zip「從ziplist」key「和所有與ziplist」value「相關的」zip「。

我該怎麼做c#linq?

+0

它沒有/我的/郵編,是嗎?哈哈 – 2011-06-16 10:43:53

+1

你的班級讓我說:_「對不起,戴夫,我害怕我不能這樣做。」_:P – digEmAll 2011-06-16 10:53:57

回答

4

所以你的意思是每Haldatazip要麼在關鍵或zipList價值?我可能會使用:

var zips = new HashSet<int>(zipList.Keys 
            .Concat(zipList.Values.SelectMany(x => x)); 
var hals = data.Where(x => zips.Contains(x.zip)); 

爲了解釋:

  • zipList.Values.SelectMany(x => x)將剛剛創建的所有值的平面視圖
  • 這與鍵連接起來的字典
  • 我內創建一個HashSet<int>從簡單和效率檢查在Where條款在一瞬間;或者一個加入會爲我們做到這一點,但感覺不是簡單的加入,當我們真的只在一個側面興趣
  • Where條款只是過濾Hal對象列表中那些具有所需zip
0
data.Join(
    zipList, 
    hal => hal.zip, 
    zlKvp => zlKvp.Key, 
    (hal, zlKvp) => new {hal,zlKvp} //hal and KeyValuePair from zipList 
); 
1

我想你想要一個Hal的列表,其中包含字典中的一個zip,其中相關的Hal由字典值中的zips列表定義。

var RelatedZips = from KeyValue in zipList 
        join halData in data on KeyValue.Key equals halData.zip 
        select new 
        { 
         ZipData = halData, 
         RelatedZipData = KeyValue.Value.Select(RelatedZipIndex => 
          data.SingleOrDefault(d => d.zip == RelatedZipIndex)) 
            .Where(z => z != null) 
        }; 

注意:代碼沒有在IDE中鍵入,未經測試!

+0

該表達式應該給你一個匿名類型,其中包含2個成員ZipData,它是Hal和RelatedZipData,它是相關Hals的列表(由您的字典定義)。如果你想要一個Hal列表,那麼我還沒有明白你想要什麼。 – 2011-06-16 11:16:28