2010-11-10 37 views

Trả lời

3

Đây phải là một chuyển ngữ khá đơn giản từ bài đăng bạn đã đề cập. Hãy chắc chắn rằng bạn đặt mã này trong một lớp ở đâu đó, mã C# phải nằm trong một lớp. Tôi giả sử bạn không quen thuộc với C#, vì vậy tôi sẽ làm đủ để cho thấy sự giống nhau và khác biệt, và hy vọng bạn có thể xử lý phần còn lại.

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

Đối với một soluiton ngữ nhiều hơn, tôi sẽ trở lại một IEnumerable<Range>, do đó, "danh sách" có thể được xây dựng và lặp đồng thời:

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

Đây không phải là rất hiệu quả, nhưng nó thành ngữ:

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

hiệu quả hơn, giả sử nó được sắp xếp:

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)' có thể được rút ngắn thành 'Tuple.Create'. –

-1

Thử nhóm K có nghĩa là nhận các dải ô. Bạn sẽ cần phải xác định có bao nhiêu phạm vi khác nhau mà bạn muốn.

+0

-1: K-có nghĩa là cho điều đó? Thậm chí sẽ không hoạt động. Phạm vi đang ở đây con số điều tra. –

+1

@Loic - Bài đăng không nói phạm vi phải bao gồm các số liên tiếp. Tôi thậm chí còn hỏi câu hỏi. – Ivan

Các vấn đề liên quan