.Take (5) возвращает счетчик 0 в коллекции ObservableCollection - PullRequest
2 голосов
/ 26 апреля 2011

Я пытаюсь использовать LINQ для получения 5 лучших результатов пинга от ObservableCollection<PingReply>, но в результате IEnumerable имеет счет 0.

Может кто-нибудь объяснить, почему объект lastFive в приведенном ниже коде возвращает счетчик 0, когда .Take(5) применяется к PingReplies?

Когда отправляется пинг, коллекция PingReplies получает этот объект в ObservableCollection

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;
using System.Collections.ObjectModel;

namespace XXX.ServerMonitor.Servers
{
    class WindowsServer : IServer
    {
        public WindowsServer(string address)
        {
            this.Address = address;
            PingReplies = new ObservableCollection<PingReply>();
            PingReplies.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(PingReplies_CollectionChanged);
        }

        void PingReplies_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
            {
                IEnumerable<PingReply> lastFive = PingReplies.Take(5);
                if (lastFive.Where(a => a.Status != IPStatus.Success).Count() == 5)
                {
                    // 5 failed attempts
                    // Server may be down
                    Console.WriteLine(Address + " may be down");
                }
            }
        }

        public ObservableCollection<PingReply> PingReplies { get; set; }

        PingReply IServer.Ping()
        {
            PingReply reply = Utils.Ping.Send(this.Address);
            PingReplies.Add(reply);
            return reply;
        }

        public string Address { get; set; }
    }
}

enter image description here

Редактировать: Фактический код загружен

1 Ответ

3 голосов
/ 26 апреля 2011

Если в коллекции нет данных, Take не возвращает элементов.Если вокруг действительно есть какие-то данные, значит, вы допустили ошибку в коде, который нам не показывали.Помните: выберите «не сломан» ...

, кстати, вместо Skip(Count - x).Take(x).

также есть Reverse.
...