2010-11-10 5 views

Antwort

3

Dies sollte eine ziemlich direkte Transliteration aus dem Beitrag sein, den Sie erwähnten. Stellen Sie sicher, dass Sie diesen Code irgendwo in einer Klasse platzieren, C# -Code muss in einer Klasse sein. Ich gehe davon aus, dass Sie mit C# nicht vertraut sind, also werde ich genug tun, um die Ähnlichkeiten und Unterschiede zu zeigen, und hoffentlich können Sie den Rest erledigen.

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; 
} 

Für eine idiomatische soluiton, würde ich ein IEnumerable<Range> zurückkehren, so dass die „Liste“ und iteriert gleichzeitig gebaut werden kann:

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

Dies ist nicht sehr effizient, aber es ist idiomatische:

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); 

effizienter, vorausgesetzt, es sortiert ist:

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)' kann mit 'Tuple.Create' kurzgeschlossen werden. –

-1

Versuchen Sie K-means Clustering, um die Bereiche zu erhalten. Sie müssen angeben, wie viele verschiedene Bereiche Sie möchten.

+0

-1: K-bedeutet das? Wird nicht einmal funktionieren. Bereiche sind hier fortlaufende Nummern. –

+1

@Loic - Der Beitrag sagt nicht, dass die Bereiche fortlaufende Nummern enthalten müssen. Ich stellte sogar die Frage. – Ivan

Verwandte Themen