Где предложение по запросу linq против словаря? - PullRequest
0 голосов
/ 21 декабря 2010

Я исправил проблему, заключающуюся в том, что я не перечислял данные, которые были связаны с неправильным полем в словаре порождения, но все же я хотел бы спросить, подходит ли мой подход к нему?

У меня есть несколько флажков, которые, если задано значение true, должны проверять состояние элемента и включать его в список.

Поэтому, не зная, что делать, я пришел к следующему:

        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
}

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

это была моя ошибка, статус на словарь был неправильным в 1 поле, и я не получал то, что хотел после перечисляя все данные, которые я заметил, хе, но нормально ли это делать как я делаю

Чтобы избежать таких ошибок, я бы использовал перечисления вместо целых - просто определите

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

и изменить

public int Status { get; set; }

в

public SomeStatus Status { get; set; }
0 голосов
/ 21 декабря 2010

Мой комментарий к предыдущему ответу еще объяснен. Вместо этого вы можете использовать атрибут 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>

Вы получите линк как:

    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

...