using System; using System.Collections.Generic; using System.Linq; public class Test { public static void Main() { var d = new Dictionary { {1, GroupType.Name} , {2, GroupType.Name | GroupType.Type} , {3, GroupType.None} }; //все типы кроме None (никогда не подходит var types = Enum.GetValues(typeof(GroupType)).Cast().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> 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 }