2010-12-21 53 views
0

我已經解決了它沒有列出與產卵詞典中的錯誤字段相關的數據的問題,但仍然想問一問我接近它的方式是否正常?關於linq查詢字典的Where子句?

我有幾個複選框,如果爲真應該添加檢查項目狀態並將其包括在列表中。

所以沒有真正知道做什麼,這就是我想出了:

 HashSet<int> status = new HashSet<int>(); 
     if (OptionsForm.filterPlayer.Checked) status.Add(0); 
     if (OptionsForm.filterEnemy.Checked) status.Add(1); 
     if (OptionsForm.filterSummon.Checked) status.Add(2); 
     if (OptionsForm.filterNPC.Checked) status.Add(3); 
     if (OptionsForm.filterObject.Checked) status.Add(4); 
     if (OptionsForm.filterMonster.Checked) status.Add(5); 
     if (OptionsForm.filterGatherable.Checked) status.Add(6); 
     if (OptionsForm.filterUnk.Checked) status.Add(7); 

     var query = from SpawnList item in spawnEntities.Values 
        where status.Contains(item.Status) 
        orderby item.Name ascending 
        select item; 

但是目前我們沒有返回我應該已經返回的任何錯誤或項目。

spawnEntities是一個帶uint的字典,SpawnList。

SpawnList是一個簡單的類:

public class SpawnList 
{ 
    public string Name { get; set; } 
    public int Status { get; set; } 
    // some more data not needed for the question 
} 
+0

狀態哈希集填寫是否正確? – SWeko 2010-12-21 09:33:46

+0

當你枚舉結果時會發生什麼? – Ani 2010-12-21 09:36:27

+1

你試過枚舉查詢(或調用'query.ToList()')?因爲LINQ查詢只在你枚舉它時執行...... – digEmAll 2010-12-21 09:39:11

回答

3

這是我的錯誤,在 字典中的地位,1場是錯的,我 沒有得到什麼,我 列出所有數據後想我注意到它,嗯, ,但它可以像我在做 那樣做嗎?

爲了避免這種錯誤,我會改用枚舉整數的 - 只是定義

enum SomeStatus 
{ 
    Player, 
    Enemy, 
    <.etc.> 
} 

,改變

public int Status { get; set; } 

public SomeStatus Status { get; set; } 
+0

+1我正要提出同樣的建議。但是你也可以添加狀態不需要是一個列表,它可以是一個「組合枚舉」。 – 2010-12-21 10:02:21

+0

@Tomas Jansson:你的意思是在'SomeStatus'上設置'[Flag]'屬性,然後通過'| ='將用戶輸入的結果合併爲一個'SomeStatus'值?它強烈地依賴於'SomeStatus'的商業含義,但通常我不會這麼做,因爲每個單獨的實體似乎都具有一個具體的狀態 - 無論是「玩家」還是「敵人」或其他 - 並且使得「SomeStatus」標記的枚舉將允許像「PlayerAndEnemy」這樣的狀態,這可能是不正確的。再次,取決於要求。 – 2010-12-21 10:15:25

+0

這就是我的意思(請參閱我的答案),並且我看到您的觀點,即應根據要求對其進行檢查。 – 2010-12-21 10:47:29

0

我的評論到以前的回答進一步解釋說。您可以使用Flags屬性代替,這將更容易檢查您的狀態。

[Flags] 
enum YourEnum 
{ 
    none, 
    Val1, 
    Val2, 
    Val3, 
    Val4, 
} 

設置你的狀態:

public YourEnum Status {get; set;} 

創建您的組合狀態,如:

YourStatus status = YourEnum.None; 
if(OptionsForm.filterPlayer.Checked) status = status | YourEnum.Val1; 
if(OptionsForm.filterEnemy.Checked) status = status | YourEnum.Val2; 
<etc> 

的,你會得到像LINQ:

var query = from SpawnList item in spawnEntities.Values 
       where status & itemStatus != YourEnum.None 
       orderby item.Name ascending 
       select item; 

閱讀更多關於這裏的flags屬性:http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx