2

LINQを使用してから上位5つのping結果を返そうとしていますObservableCollection<PingReply>が、結果IEnumerableのカウントは0です。

以下のコードのオブジェクトがに適用されlastFiveたときにカウント0を返す理由を誰かが説明できますか?.Take(5)PingReplies

pingが送信されると、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; }
    }
}

ここに画像の説明を入力してください

編集:アップロードされた実際のコード

4

1 に答える 1

3

コレクションにデータがない場合、Takeアイテムは返されません。実際にデータが含まれている場合は、表示していないコードに誤りがあったに違いありません。覚えておいてください:選択は壊れていません...

ちなみに、のReverse代わりに、もありSkip(Count - x).Take(x)ます。

于 2011-04-26T16:27:47.727 に答える