using Microsoft.Extensions.DependencyInjection; using System.Collections.Generic; using System.Linq; using System.Net; namespace FastGithub.Scanner { /// /// GithubContext集合 /// [Service(ServiceLifetime.Singleton)] sealed class GithubScanResults { private readonly object syncRoot = new(); private readonly List contexts = new(); /// /// 添加GithubContext /// /// /// public bool Add(GithubContext context) { lock (this.syncRoot) { if (this.contexts.Contains(context)) { return false; } this.contexts.Add(context); return true; } } /// /// 转换为数组 /// /// public GithubContext[] ToArray() { lock (this.syncRoot) { return this.contexts.ToArray(); } } /// /// 查找最优的ip /// /// /// public IPAddress? FindBestAddress(string domain) { lock (this.syncRoot) { return this.contexts .Where(item => item.Domain == domain && item.AvailableRate > 0d) .OrderByDescending(item => item.AvailableRate) .ThenByDescending(item => item.Available) .ThenBy(item => item.AvgElapsed) .Select(item => item.Address) .FirstOrDefault(); } } } }