2010-11-10 35 views

回答

3

這應該是你提到的帖子的一個非常直接的音譯。確保你把這個代碼放在一個類的某個地方,C#代碼必須在一個類中。我假設你對C#不是很熟悉,所以我會做足夠的展示相似之處和差異,並希望你可以處理其餘的問題。

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

對於更地道soluiton,我將返回一個IEnumerable<Range>,因此,「列表」可以建,同時迭代:

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

這是不是很有效,但它成語:

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

更高效,假設它的排序:

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)'可以簡寫爲'Tuple.Create'。 – 2010-11-10 21:00:27

-1

嘗試使用K-means聚類來獲取範圍。你需要指定你想要的不同範圍。

+0

-1:K-means爲什麼?甚至不會工作。範圍在這裏是連續的數字。 – 2010-11-11 01:11:23

+1

@Loic - 這篇文章沒有說範圍必須包含連續的數字。我甚至問過這個問題。 – Ivan 2010-11-12 15:18:05