为什么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页面上创建了一个问题,必须等待一个实际的开发人员来解决。。。
就我对旧源代码的挖掘而言,没有什么好的理由。具有讽刺意味的是,IList<string>
被交到MultipleSignalProxy
类中,在那里它使用另一个LINQ表达式被迅速映射到不同的格式,然后就是.ToList()
’d。因此,基于实现中的确切用法,他们真的不需要IEnumerable<string>
以外的任何东西。
我的最佳答案是SignalR在内部使用IList的增强功能,如获取计数或迭代集合,以及对IList(而不是ICollection)使用的基于索引的访问的额外使用。使用更健壮的类的唯一原因是他们在某个地方使用它,或者觉得需要额外的功能。否则,我会假设使用ICollection的较轻类或IEnumerable的最佳实践,基本上是Enumerable->Collection->List继承的基类。
G