vmh
vmh

Reputation: 57

Checking a dictionary if there are same values for a key

I have a dictionary object like this:

CustomKeys<int, string>

eg;

1000, F1
1001, F2
1002, F1
1003, F4
1004, F2

I want to know if I have more than 1 of same values in this dictionary. I would also want to keep a note of which keys(unique id) has duplicates.

Is that possible?

Upvotes: 0

Views: 2831

Answers (4)

Omar
Omar

Reputation: 16623

Another solution could be:

var duplicates = dictionary.GroupBy( g => g.Value )
                           .Where( x => x.Count( ) > 1 )
                           .Select( x => new { Item = x.First( ), Count = x.Count( ) } )
                           .ToList( );

Upvotes: 1

cubski
cubski

Reputation: 3248

I'm not sure by what you mean by "keeping note of which has duplicate values". If you mean keeping note of the keys, you could do this:

        var keys = new Dictionary<int, string>();
        keys.Add(1000, "F1");
        keys.Add(1001, "F2");
        keys.Add(1002, "F1");
        keys.Add(1003, "F4");
        keys.Add(1004, "F2");

        var duplicates = keys.GroupBy(i => i.Value).Select(i => new
        {
            keys = i.Select(x => x.Key),
            value = i.Key,
            count = i.Count()
        });

        foreach (var duplicate in duplicates)
        {
            Console.WriteLine("Value: {0} Count: {1}", duplicate.value, duplicate.count);
            foreach (var key in duplicate.keys)
            {
                Console.WriteLine(" - {0}", key);
            }
        }

If you mean keeping track of the duplicate values only, see Sonor's answer.

Upvotes: 1

Soner G&#246;n&#252;l
Soner G&#246;n&#252;l

Reputation: 98740

You can find all key values they had the same values like this;

    Dictionary<int, string> d = new Dictionary<int, string>();
    d.Add(1000, "F1");
    d.Add(1001, "F2");
    d.Add(1002, "F1");
    d.Add(1003, "F4");
    d.Add(1004, "F2");

    var dublicate = d.ToLookup(x => x.Value, x => x.Key).Where(x => x.Count() > 1);

    foreach (var i in dublicate)
    {
        Console.WriteLine(i.Key);
    }

Here is a DEMO.

But if you want to get a boolean value since your item's has a same value, look at Magnus's answer which is great.

Upvotes: 3

Magnus
Magnus

Reputation: 46909

It is possible using GroupBy and than Count() > 1 to keep track of which values that have duplicates.

var q = dic.GroupBy(x => x.Value)
        .Select (x => new { Item = x, HasDuplicates = x.Count() > 1 });

Upvotes: 4

Related Questions