using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Main()
{
var d = new Dictionary<int, GroupType>
{
{1, GroupType.Name}
,
{2, GroupType.Name | GroupType.Type}
,
{3, GroupType.None}
};
//все типы кроме None (никогда не подходит
var types = Enum.GetValues(typeof(GroupType)).Cast<GroupType>().ToList();
var dRes = d
//для каждой записи в словаре выбираем все входящие в значение типы в паре с ключом
.SelectMany(entry => types.Where(t => HasFlag(entry.Value, t)).Select(t => new {t, entry.Key}))
//группируем по типу
.GroupBy(pair => pair.t, pair => pair.Key)
//переводим в словарь
.ToDictionary(group => group.Key, group => group.ToList());
PrintDictionary(dRes);
}
private static bool HasFlag(GroupType value, GroupType flag)
{
if(flag==GroupType.None) return ((int) value)==0;
return value.HasFlag(flag);
}
private static void PrintDictionary(Dictionary<GroupType, List<int>> dRes)
{
Console.WriteLine(string.Join(Environment.NewLine, dRes.Select(x => x.Key + "=" + String.Join(",", x.Value)).ToArray()));
}
}
enum GroupType
{
None = 0x0000,
Name = 0x0001,
Ext = 0x0002,
Type = 0x0004
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgoKcHVibGljIGNsYXNzIFRlc3QKewogICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIHZhciBkID0gbmV3IERpY3Rpb25hcnk8aW50LCBHcm91cFR5cGU+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHsxLCBHcm91cFR5cGUuTmFtZX0KICAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgIHsyLCBHcm91cFR5cGUuTmFtZSB8IEdyb3VwVHlwZS5UeXBlfQogICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgezMsIEdyb3VwVHlwZS5Ob25lfQogICAgICAgICAgICB9OwogICAgICAgIC8v0LLRgdC1INGC0LjQv9GLINC60YDQvtC80LUgTm9uZSAo0L3QuNC60L7Qs9C00LAg0L3QtSDQv9C+0LTRhdC+0LTQuNGCCiAgICAgICAgdmFyIHR5cGVzID0gRW51bS5HZXRWYWx1ZXModHlwZW9mKEdyb3VwVHlwZSkpLkNhc3Q8R3JvdXBUeXBlPigpLlRvTGlzdCgpOwogICAgICAgIHZhciBkUmVzID0gZAogICAgICAgICAgICAgICAgICAgIC8v0LTQu9GPINC60LDQttC00L7QuSDQt9Cw0L/QuNGB0Lgg0LIg0YHQu9C+0LLQsNGA0LUg0LLRi9Cx0LjRgNCw0LXQvCDQstGB0LUg0LLRhdC+0LTRj9GJ0LjQtSDQsiDQt9C90LDRh9C10L3QuNC1INGC0LjQv9GLINCyINC/0LDRgNC1INGBINC60LvRjtGH0L7QvAogICAgICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KGVudHJ5ID0+IHR5cGVzLldoZXJlKHQgPT4gSGFzRmxhZyhlbnRyeS5WYWx1ZSwgdCkpLlNlbGVjdCh0ID0+IG5ldyB7dCwgZW50cnkuS2V5fSkpCiAgICAgICAgICAgICAgICAgICAgLy/Qs9GA0YPQv9C/0LjRgNGD0LXQvCDQv9C+INGC0LjQv9GDCiAgICAgICAgICAgICAgICAgICAgLkdyb3VwQnkocGFpciA9PiBwYWlyLnQsIHBhaXIgPT4gcGFpci5LZXkpCiAgICAgICAgICAgICAgICAgICAgLy/Qv9C10YDQtdCy0L7QtNC40Lwg0LIg0YHQu9C+0LLQsNGA0YwKICAgICAgICAgICAgICAgICAgICAuVG9EaWN0aW9uYXJ5KGdyb3VwID0+IGdyb3VwLktleSwgZ3JvdXAgPT4gZ3JvdXAuVG9MaXN0KCkpOwogICAgICAgIFByaW50RGljdGlvbmFyeShkUmVzKTsKICAgIH0KCQogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBIYXNGbGFnKEdyb3VwVHlwZSB2YWx1ZSwgR3JvdXBUeXBlIGZsYWcpCiAgICB7CiAgICAgICAgaWYoZmxhZz09R3JvdXBUeXBlLk5vbmUpIHJldHVybiAoKGludCkgdmFsdWUpPT0wOwogICAgICAgIHJldHVybiB2YWx1ZS5IYXNGbGFnKGZsYWcpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnREaWN0aW9uYXJ5KERpY3Rpb25hcnk8R3JvdXBUeXBlLCBMaXN0PGludD4+IGRSZXMpCiAgICB7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoc3RyaW5nLkpvaW4oRW52aXJvbm1lbnQuTmV3TGluZSwgZFJlcy5TZWxlY3QoeCA9PiB4LktleSArICI9IiArIFN0cmluZy5Kb2luKCIsIiwgeC5WYWx1ZSkpLlRvQXJyYXkoKSkpOwogICAgfQp9CgplbnVtIEdyb3VwVHlwZQp7CiAgICBOb25lID0gMHgwMDAwLAogICAgTmFtZSA9IDB4MDAwMSwKICAgIEV4dCA9IDB4MDAwMiwKICAgIFR5cGUgPSAweDAwMDQKfQ==