Линк к объектам: если число находится в словаре, вернуть номер, иначе вернуть 0 - PullRequest
4 голосов
/ 02 июля 2011

У меня есть Dictionary<int int>. Когда я проверяю ключи словаря на наличие номера, я хочу, чтобы он возвращал число, иначе я хочу, чтобы запрос linq возвращал 0.

Примерно так, кроме работы

var t = (from result in results
         where result.Key == 3
         select result.Key != null ? result.Value : 0).First();

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

Ответы [ 6 ]

6 голосов
/ 02 июля 2011

Просто используйте TryGetValue.

int i;
results.TryGetValue(3, out i);

Если он найдет, i будет установлено в значение.Если нет, то i является значением по умолчанию, которое будет равно нулю для int.

Если вам нужно другое значение помимо значения по умолчанию, вы можете сделать это:

int i;
if (!results.TryGetValue(3, out i))
{
    i = 5; // or whatever other value you want;
}

И если вы, как я, ненавидя стиль параметра out, вы можете создать метод расширения

public static class IDictionaryExtensions
{
    public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
    {
        T i;
        dictionary.TryGetValue(key, out i);
        return i;
    }
}

, а затем вы можете вызвать:

int i = dictionary.GetValueOrDefault(3);

, и если вы хотите стать более любопытным, вы можете создать еще одинoveload расширения:

    public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue)
    {
        T i;
        return dictionary.TryGetValue(key, out i) ? i : defaultValue;
    }

, которое можно назвать

int i = dictionary.GetValueOrDefault(3, 5);
3 голосов
/ 02 июля 2011

Почему не просто

var t = results.ContainsKey(3) ? results[3] : 0;

и вообще обойтись без необходимости LINQ?

2 голосов
/ 02 июля 2011
return results.ContainsKey(key) ? results[key] : 0;
1 голос
/ 02 июля 2011

Похоже, results - это ваш словарь.

Dictionary<int int> results = new Dictionary<int,int>{{1,1},{3,3}};
int value;
results.TryGetValue (4, out value);
return value;

value - это 0, потому что TryGetValue устанавливает его в default(int), что, конечно, 0.

Вы можете использовать linq, если хотите больше печатать, вводить людей в заблуждение, читающих ваш код, и замедлять работу.Это не будет использовать хеш-код, поэтому это медленный поиск Big O (n).

var t = (from result in results
      where result.Key == 3
      select result.Key != null ? result.Value : 0).FirstOrDefault();
0 голосов
/ 02 июля 2011

Выберите значение и затем:

ToArray().FirstOrDefault()
0 голосов
/ 02 июля 2011

Попробуйте var t = (from result in results where result.Key == 3 select result.Value).FirstOrDefault();

Теперь либо у вас есть совпадение в предложении where, поэтому select выберет правильное значение, либо у вас пустая последовательность.FirstOrDefault () затем либо возвращает значение (если оно существует), либо 0 (по умолчанию для целых чисел.)

...