fork download
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6.  
  7. namespace GroupByCluster
  8. {
  9. public static class EnumerableExtensions
  10. {
  11. class ClusterGrouping<T> : IGrouping<T, T>
  12. {
  13. public T Key { get; private set; }
  14.  
  15. public IEnumerator<T> GetEnumerator()
  16. {
  17. return items.GetEnumerator();
  18. }
  19.  
  20. IEnumerator IEnumerable.GetEnumerator()
  21. {
  22. return GetEnumerator();
  23. }
  24.  
  25. internal readonly List<T> items = new List<T>();
  26.  
  27. internal ClusterGrouping(T t)
  28. {
  29. Key = t;
  30. items.Add(t);
  31. }
  32.  
  33. internal ClusterGrouping(IEnumerable<ClusterGrouping<T>> containingGroups)
  34. {
  35. Key = containingGroups.First().Key;
  36. items.AddRange(containingGroups.SelectMany(g => g));
  37. }
  38.  
  39. internal void Include(T t)
  40. {
  41. items.Add(t);
  42. }
  43. }
  44.  
  45. public static IEnumerable<IGrouping<T, T>> GroupByCluster<T>(this IEnumerable<T> source, Func<T, T, double> distance, double eps)
  46. {
  47. var result = new HashSet<ClusterGrouping<T>>();
  48. foreach (T t in source)
  49. {
  50. // need to materialize, as we are changing the result
  51. var containingGroups = result.Where(g => g.Any(gt => distance(t, gt) < eps)).ToList();
  52. switch (containingGroups.Count)
  53. {
  54. case 0:
  55. result.Add(new ClusterGrouping<T>(t));
  56. break;
  57. case 1:
  58. containingGroups[0].Include(t);
  59. break;
  60. default:
  61. result.Add(new ClusterGrouping<T>(containingGroups));
  62. foreach (var g in containingGroups)
  63. result.Remove(g);
  64. break;
  65. }
  66. }
  67. return result;
  68. }
  69. }
  70. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cs(67,13): error CS0266: Cannot implicitly convert type `System.Collections.Generic.HashSet<GroupByCluster.EnumerableExtensions.ClusterGrouping<T>>' to `System.Collections.Generic.IEnumerable<System.Linq.IGrouping<T,T>>'. An explicit conversion exists (are you missing a cast?)
Compilation failed: 1 error(s), 0 warnings
stdout
Standard output is empty