为什么SignalR在其合同和内部的所有地方都使用IList,而不是IEnumerable

本文关键字:IList IEnumerable 合同 SignalR 内部 为什么 | 更新日期: 2023-09-27 18:21:27

我根据个人用户的角色向他们发送消息,为了实现这一点,我有以下代码:

public static void Add(Guid userId, IEnumerable<SnapshotItem> snapshot)
{
    var hub = GlobalHost.ConnectionManager.GetHubContext<FeedbackHub>();
    var items = ApplicationDbContext.Instance.InsertSnapshot(userId, Guid.NewGuid(), snapshot);
    foreach (var sendOperation in ConnectedUsers.Instance.EnumerateSendOperations(items))
    {
        hub.Clients.Users(sendOperation.Groups.SelectMany(x => x.Users).Select(x => x.Id).ToList()).OnDataFeedback(sendOperation.Items);
    }
}

我不知道为什么每次需要发送东西时都必须调用.ToList(),我的后备存储是HashSet<String>,我希望SignalR使用这种类型的存储,而不是每次将其转换为List,因为这显然会消耗处理能力和内存。

既然在后台SignalR正在对参数users或connectionId进行简单的迭代,那么使用IEnumerable而不是IList不是更明智吗?我已经研究了SignalR的来源,应该不会很难实现吗?使用IList是否有特殊原因?


编辑

在SignalR github页面上创建了一个问题,必须等待一个实际的开发人员来解决。。。

为什么SignalR在其合同和内部的所有地方都使用IList,而不是IEnumerable

就我对旧源代码的挖掘而言,没有什么好的理由。具有讽刺意味的是,IList<string>被交到MultipleSignalProxy类中,在那里它使用另一个LINQ表达式被迅速映射到不同的格式,然后就是.ToList()’d。因此,基于实现中的确切用法,他们真的不需要IEnumerable<string>以外的任何东西。

我的最佳答案是SignalR在内部使用IList的增强功能,如获取计数或迭代集合,以及对IList(而不是ICollection)使用的基于索引的访问的额外使用。使用更健壮的类的唯一原因是他们在某个地方使用它,或者觉得需要额外的功能。否则,我会假设使用ICollection的较轻类或IEnumerable的最佳实践,基本上是Enumerable->Collection->List继承的基类。

G