2009-12-09 60 views
0

好吧,我試圖得到這個工作。這是我第一次使用LINQ。到目前爲止,除了我一直在試圖弄清楚的一點小瑕疵外,沒關係。WHERE子句和發送2個無與倫比PARAMS到自定義方法

場景:我有2名泛型列表我送的方法。該方法在下面給出了一個僅列出那些對象(聯合)的列表,在這兩個對象中都有一個特定的ID。這些列表可以具有不同的長度和不同的ID順序。目標或我想要做的是從比較這兩個列表中取回,這兩個列表都是具有相同ID的對象列表。 此外,當我發現在這兩個列表(按ID)匹配的對象不給我回該對象還沒有,除非調用OptionsMatch也是如此(這就是爲什麼我有& &)。

主要的問題我已經是列表的長度可以是完全不同的,在ID列表甚至差異。但是我們知道,我們傳遞給我的方法的所有列表都將具有某些通用性,這些對象將通過ID進行匹配......不管是什麼樣的長度或順序,我們所比較的2個列表都是......我們希望只有當對匹配的ID集合的OptionsMatch調用也匹配時才返回列表的聯合。

這裏是我的LINQ證明(原件)

List<SavedItemOption> finalItemOptions = savedItemOptions.Where(y => itemOptions.All(x => OptionsMatch(x,y) && (y.actID == x.Id))).ToList(); 

我最近把它改成這樣:

列表finalItemOptions = savedItemOptions.Where(Y =>(y.actID == x.Id )& & itemOptions.All(x => OptionsMatch(x,y)))。ToList();

但同樣的問題是,LINQ是y隨x中所有其他ID進行比較的第一個ID。那很棒。取第一個y.actID並查看所有x的x.ID.但隨後停止。它不會移動到下一個savedItemOptions索引,並再次將y.actID與所有x的x.ID進行比較。

+0

這個問題:列表 finalItemOptions = savedItemOptions.Where(Y =>(y.actID == x.Id)&& itemOptions.All (x => OptionsMatch(x,y)))。ToList(); 是,當我調試,通過列出第二迭代期間,在無序列表的第二個ID是不一樣的,所以它永遠不會結束了打我的OptionsMatch方法的第二次左右通過LINQ迭代。它看到itemOptions [1]中的ID與savedItemOptions [1]中的id不同,因此會跳過OptionsMatch方法 – PositiveGuy 2009-12-09 16:27:59

+0

請編輯您的問題,而不是向其添加註釋...並添加一些示例數據。從你所說的話,我以爲你會*想*它跳過OptionsMatch對不同ID的配對... – 2009-12-09 16:29:23

回答

1

那真的很容易 - 只需改變你的表達順序:

List<SavedItemOption> finalItemOptions = savedItemOptions 
    .Where(y => itemOptions.Any(x => y.actID == x.Id && OptionsMatch(x,y))) 
    .ToList(); 

這依賴於& &運營商的C#的短路 - 如果LHS返回false,RHS不計算。

另一種選擇是使用一個加入:

var finalItemOptions = (from y in savedItemOptions 
         join x in itemOptions on y.actID equals x.Id 
         where OptionsMatch(x, y) 
         select y).ToList(); 
+0

仍然無法正常工作。它在2個列表之間以前進方式移動,所以在第一次時,身份識別號恰好匹配,確信他們是2個列表中的第一個。但是,一旦迭代並檢查了列表中的第二組ID,ID就不同,因此它不會遇到我的MatchOptions方法。 – PositiveGuy 2009-12-09 16:25:58

+0

@coffeeaddict:恐怕我無法真正理解你所看到的情況。如果你可以包含一個簡短而完整的程序來重現問題,那麼它會更加簡單。我給出的代碼*將*只會調用具有相同ID的項目的選項匹配,並且應該找到那些項目,如果它們存在... – 2009-12-09 16:27:57

+0

請參閱原始帖子的更新評論... – PositiveGuy 2009-12-09 16:29:22