Câu hỏi liên quan

+1 Phiếu
0 Câu trả lời
0 Phiếu
4 Câu trả lời
0 Phiếu
0 Câu trả lời
+1 Phiếu
0 Câu trả lời

LINQ để đếm tiếp tục lặp đi lặp lại items(int) trong một mảng int?


0 Phiếu
Đã hỏi 22/4/2016 bởi hyon7587 (150 điểm)
Dưới đây là một kịch bản của câu hỏi của tôi: tôi có một mảng, nói rằng:
{ 4, 1, 1, 3, 3, 2, 5, 3, 2, 2 }
kết quả nên là một cái gì đó như thế này (mảng element => của nó đếm):
4 => 1
1 => 2
3 => 2
2 => 1
5 => 1
3 => 1
2 => 2
tôi biết điều này có thể đạt được bằng for loop. Nhưng google đã có rất nhiều để làm cho điều này có thể sử dụng ít hơn các dòng code bằng cách sử dụng LINQ không thành công.

5 Câu trả lời

0 Phiếu
Đã trả lời 09/5/2016 bởi Fnz922yurek (660 điểm)
được bình chọn là câu trả lời hay nhất 11/5/2016 bởi Tbv_3529
 
Câu trả lời hay nhất
Dưới đây là một expression LINQ hoạt động (chỉnh sửa: thắt chặt lên code chỉ cần một ít hơn):
var data = new int[] { 4, 1, 1, 3, 3, 2, 5, 3, 2, 2 };
var result = data.Select ((item, index) =>
                        new
                        {
                            Key = item,
                            Count = (index == 0 || data.ElementAt(index - 1) != item) 
                                ? data.Skip(index).TakeWhile (d => d == item).Count ()
                                : -1
                        }
                          )
                  .Where (d => d.Count != -1);
ở đây là một bằng chứng cho thấy nó làm việc.
Đã bình luận 09/5/2016 bởi Gur9363phong (880 điểm)
Nó rất khó để xem như thế nào theo chiều dài của mảng có thể được cố định ở 6 nếu một ví dụ là 4, 1, 1, 3, 3, 2, 5, 3, 2, 2...
Đã bình luận 10/5/2016 bởi a_lalk (110 điểm)
Bạn thực sự đang run-length encoding (http://en.wikipedia.org/wiki/Run_length_encoding)?
Đã bình luận 11/5/2016 bởi Tbv_3529 (440 điểm)
, Tôi tin rằng bạn là đúng, về cơ bản đếm số lặp đi lặp lại
Đã bình luận 11/5/2016 bởi nal_Narr (670 điểm)
: Nó không phải là thực sự "của khóa học" - câu hỏi của bạn không rõ ràng cho rằng bạn không bao giờ sử dụng từ "liên tiếp" đó là các bit quan trọng ở đây. Thực tế là ba người * all * trả lời các câu hỏi, giả sử bạn có nghĩa là chỉ cần đếm các mục lặp lại của các yếu tố gợi ý bạn nên chỉnh sửa để làm cho nó rõ ràng hơn...
0 Phiếu
Đã trả lời 09/5/2016 bởi Pnalymon (370 điểm)
Hãy thử GroupBy thông qua List<int>
        List<int> list = new List<int>() { 4, 1, 1, 3, 3, 2, 5, 3, 2, 2 };
        var res = list.GroupBy(val => val);
        foreach (var v in res)
        {
            MessageBox.Show(v.Key.ToString() + "=>" + v.Count().ToString());
        }
–1 Phiếu
Đã trả lời 09/5/2016 bởi pbz3147Be (650 điểm)
Tôi tin rằng tối ưu nhất cách để làm điều này là để tạo ra một "LINQ-giống như" phương pháp mở rộng bằng cách sử dụng một khối iterator. Điều này cho phép bạn thực hiện các phép tính làm một pass duy nhất trên dữ liệu của bạn. Lưu ý rằng hiệu suất là không quan trọng ở tất cả nếu bạn chỉ muốn thực hiện tính toán trên một mảng nhỏ của con số. Tất nhiên điều này thực sự của bạn cho loop trong ngụy trang.
static class Extensions {
  public static IEnumerable<Tuple<T, Int32>> ToRunLengths<T>(this IEnumerable<T> source) {
    using (var enumerator = source.GetEnumerator()) {
      // Empty input leads to empty output.
      if (!enumerator.MoveNext())
        yield break;
      // Retrieve first item of the sequence.
      var currentValue = enumerator.Current;
      var runLength = 1;
      // Iterate the remaining items in the sequence.
      while (enumerator.MoveNext()) {
        var value = enumerator.Current;
        if (!Equals(value, currentValue)) {
          // A new run is starting. Return the previous run.
          yield return Tuple.Create(currentValue, runLength);
          currentValue = value;
          runLength = 0;
        }
        runLength += 1;
      }
      // Return the last run.
      yield return Tuple.Create(currentValue, runLength);
    }
  }
}
lưu ý rằng phần mở rộng method chung và bạn có thể sử dụng nó trên bất kỳ loại. Giá trị được so sánh bình đẳng bằng cách sử dụng Object.Equals. Tuy nhiên, nếu bạn muốn để bạn có thể vượt qua một IEqualityComparer<T> cho phép tuỳ biến của giá trị được so sánh như thế nào. Bạn có thể sử dụng method như thế này:
var numbers = new[] { 4, 1, 1, 3, 3, 2, 5, 3, 2, 2 };
var runLengths = numbers.ToRunLengths();
cho input data kết quả sẽ là những tuples:
4 1 
1 2 
3 2 
2 1 
5 1 
3 1 
2 2 
Đã bình luận 09/5/2016 bởi chand7740 (150 điểm)
Bây giờ xin vui lòng kiểm tra các câu hỏi
0 Phiếu
Đã trả lời 09/5/2016 bởi Shila_dec (970 điểm)
Tôi tin rằng tối ưu nhất cách để làm điều này là để tạo ra một "LINQ-giống như" phương pháp mở rộng bằng cách sử dụng một khối iterator. Điều này cho phép bạn thực hiện các phép tính làm một pass duy nhất trên dữ liệu của bạn. Lưu ý rằng hiệu suất là không quan trọng ở tất cả nếu bạn chỉ muốn thực hiện tính toán trên một mảng nhỏ của con số. Tất nhiên điều này thực sự của bạn cho loop trong ngụy trang.
static class Extensions {
  public static IEnumerable<Tuple<T, Int32>> ToRunLengths<T>(this IEnumerable<T> source) {
    using (var enumerator = source.GetEnumerator()) {
      // Empty input leads to empty output.
      if (!enumerator.MoveNext())
        yield break;
      // Retrieve first item of the sequence.
      var currentValue = enumerator.Current;
      var runLength = 1;
      // Iterate the remaining items in the sequence.
      while (enumerator.MoveNext()) {
        var value = enumerator.Current;
        if (!Equals(value, currentValue)) {
          // A new run is starting. Return the previous run.
          yield return Tuple.Create(currentValue, runLength);
          currentValue = value;
          runLength = 0;
        }
        runLength += 1;
      }
      // Return the last run.
      yield return Tuple.Create(currentValue, runLength);
    }
  }
}
lưu ý rằng phần mở rộng method chung và bạn có thể sử dụng nó trên bất kỳ loại. Giá trị được so sánh bình đẳng bằng cách sử dụng Object.Equals. Tuy nhiên, nếu bạn muốn để bạn có thể vượt qua một IEqualityComparer<T> cho phép tuỳ biến của giá trị được so sánh như thế nào. Bạn có thể sử dụng method như thế này:
var numbers = new[] { 4, 1, 1, 3, 3, 2, 5, 3, 2, 2 };
var runLengths = numbers.ToRunLengths();
cho input data kết quả sẽ là những tuples:
4 1 
1 2 
3 2 
2 1 
5 1 
3 1 
2 2 
Đã bình luận 09/5/2016 bởi Hfr_If (850 điểm)
Tại sao output có trùng lặp phím số "2" và "3"? Không nên thay vào đó bạn mong đợi một output là "4 => 1, 1 => 2, 3 => 3, 2 => 3, 5 => 1"?
Đã bình luận 11/5/2016 bởi again_It (170 điểm)
của khóa học không phải là lần xuất hiện trùng lặp @ WiktorZychla
0 Phiếu
Đã trả lời 09/5/2016 bởi Sbefor (270 điểm)
Điều này không phải ngắn đủ?
public static IEnumerable<KeyValuePair<T, int>> Repeats<T>(
        this IEnumerable<T> source)
{
    int count = 0;
    T lastItem = source.First();
    foreach (var item in source)
    {
        if (Equals(item, lastItem))
        {
            count++;
        }
        else
        {
           yield return new KeyValuePair<T, int>(lastItem, count);
           lastItem = item;
           count = 1;
        }
    }
    yield return new KeyValuePair<T, int>(lastItem, count);
}
tôi sẽ được quan tâm để xem linq một cách.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...