Home > Software engineering >  Return values of dictionary except for a given key
Return values of dictionary except for a given key

Time:06-11

I have what seems like a very simple problem, but for some reason it's not working and I haven't been able to find a solution.

I have a dictionary, with a numeric key and a class object as the value. I want to enter a key and return all values for the dictionary except the value for the specified key.

The example below return nothing.

        static readonly Dictionary<int, LinkDto> _chips = new Dictionary<int, LinkDto>()
        {
            { 100, new LinkDto("url1", "text1") },
            { 200, new LinkDto("url2", "text2") },
            { 500, new LinkDto("url3", "text3") },
            { 1000, new LinkDto("url4", "text4") },
            { 1500, new LinkDto("url5", "text5") },
        };

This is the method that interrogates the dictionary:

    public void Build(int key)
    {
        Build(_chips
            .Where(x => !_chips.ContainsKey(key))
            .Select(x => x.Value).ToList());
    }

And this is the call:

Build(1500);

I expect it to return the values for 100, 200, 500 and 1000.

CodePudding user response:


public static IEnumerable<TValue> GetOtherValues<TKey,TValue>( this IReadOnlyDictionary<TKey,TValue> dict, TKey notThisKey )
    where TKey : notnull, IEquatable<TKey>
{
    if( dict is null ) throw new ArgumentNullException(nameof(dict));

    return dict.Where( kvp => !notThisKey.Equals( kvp.Key ) ).Select( kvp => kvp.Value );
}

CodePudding user response:

The code

_chips.Where(x => !_chips.ContainsKey(key))

will return no entries in _chips in the case where _chips does contain an entry with a key equal to key.
It will return all entries in the case where _chips contains no entry with a key equal to key.

Considering your example dictionary (containing keys 100, 200, 500, 1000, 1500) and example key value of 1500, the filtering operation actually is:

_chips.Where(x => !_chips.ContainsKey(1500))

The !_chips.ContainsKey(1500) part never changes for any of the dictionary entries (x), and will therefore have the same value when performing the filtering for all entries; regardless of the entry's Key value.

I am quite sure that you want to replace the .Where() expression with something like:

.Where(x => x.Key != key)

to filter out the entry whose Key equals the provided key value.

  • Related