2010-11-10 6 views

Respuesta

3

Esta debe ser una transliteración bastante sencilla de la publicación que mencionas. Asegúrate de poner este código en una clase en alguna parte, el código C# tiene que estar en una clase. Asumo que no estás muy familiarizado con C#, así que haré lo suficiente para mostrar las similitudes y diferencias, y espero que puedas encargarte del resto.

struct Range 
{ 
    public Range (int start, int end) { this.start = start; this.end = end; } 
    public int start; 
    public int end; 
} 

public static void SetToRanges(Dictionary<int,bool> indices, List<Range> ranges) 
{ 
    Range r = new Range(int.MinValue, int.MaxValue); 
    foreach (int i in indices.Keys) 
    { 
     // translate rest of code here 
    } 
    ranges.Add(r); 
    return ranges; 
} 

Para una soluiton más idiomática, volvería un IEnumerable<Range>, por lo que la "lista" se puede construir y reiteró al mismo tiempo:

public static IEnumerable<Range> SetToRanges(Dictionary<int, bool> indices) 
{ 
    // instead of "ranges.Add(r)", use "yield return r". 
    // This returns multiple values in order from the function, that can 
    // be iterated with "foreach (Range i in SetToRanges(foo))" 
} 
10

Esto no es muy eficiente, pero es idiomática:

var nums = new HashSet<int>{0, 1, 2, 3, 4, 7, 8, 9, 11}; 
IEnumerable<Tuple<int, int>> ranges = Enumerable.Zip(
    nums.Where(n => !nums.Contains(n - 1)), 
    nums.Where(n => !nums.Contains(n + 1)), 
    Tuple.Create); 

más eficiente, asumiendo que es ordenada:

public IEnumerable<Tuple<int, int>> GetContiguousRanges(IEnumerable<int> nums) 
{ 
    int start = nums.First(); 
    int last = start - 1; 
    foreach (int i in nums) 
    { 
     if (i != last + 1) 
     { 
      yield return Tuple.Create(start, last); 
      start = i; 
     } 
     last = i; 
    } 
    yield return Tuple.Create(start, last); 
} 
+1

'(x, y) => Tuple.Create (x, y)' puede ser cortocircuitado a solo 'Tuple.Create'. –

-1

Pruebe K-means clustering para obtener los rangos. Deberá especificar cuántos rangos diferentes quiere.

+0

-1: K-means para eso? Ni siquiera funciona. Los rangos son aquí números consecutivos. –

+1

@Loic: la publicación no dice que los rangos deben incluir números consecutivos. Incluso hice la pregunta. – Ivan

Cuestiones relacionadas