fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5.  
  6. public class Test
  7. {
  8. public static void Main()
  9. {
  10. var d = new Dictionary<int, GroupType>
  11. {
  12. {1, GroupType.Name}
  13. ,
  14. {2, GroupType.Name | GroupType.Type}
  15. ,
  16. {3, GroupType.None}
  17. };
  18. //все типы кроме None (никогда не подходит
  19. var types = Enum.GetValues(typeof(GroupType)).Cast<GroupType>().ToList();
  20. var dRes = d
  21. //для каждой записи в словаре выбираем все входящие в значение типы в паре с ключом
  22. .SelectMany(entry => types.Where(t => HasFlag(entry.Value, t)).Select(t => new {t, entry.Key}))
  23. //группируем по типу
  24. .GroupBy(pair => pair.t, pair => pair.Key)
  25. //переводим в словарь
  26. .ToDictionary(group => group.Key, group => group.ToList());
  27. PrintDictionary(dRes);
  28. }
  29.  
  30. private static bool HasFlag(GroupType value, GroupType flag)
  31. {
  32. if(flag==GroupType.None) return ((int) value)==0;
  33. return value.HasFlag(flag);
  34. }
  35.  
  36. private static void PrintDictionary(Dictionary<GroupType, List<int>> dRes)
  37. {
  38. Console.WriteLine(string.Join(Environment.NewLine, dRes.Select(x => x.Key + "=" + String.Join(",", x.Value)).ToArray()));
  39. }
  40. }
  41.  
  42. enum GroupType
  43. {
  44. None = 0x0000,
  45. Name = 0x0001,
  46. Ext = 0x0002,
  47. Type = 0x0004
  48. }
Success #stdin #stdout 0.03s 17148KB
stdin
Standard input is empty
stdout
Name=1,2
Type=2
None=3