为什么SignalR在其合同中使用IList而在其内部的任何地方使用IList而不是IEnumerable?

时间:2014-09-09 20:55:18

标签: c# signalr

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

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对参数用户或connectionId进行简单迭代,因此使用IEnumerable代替IList更为明智,我已经研究过了SignalR来源,难道难以实现吗?是否有使用IList的特殊原因?


修改

在SignalR github页面上创建了一个问题,必须等待其中一个实际开发人员才能清除...

2 个答案:

答案 0 :(得分:3)

就我可以看到挖掘旧的源代码而言,没有充分的理由。具有讽刺意味的是,IList<string>被传递到MultipleSignalProxyit is promptly mapped to a different format using another LINQ expression,然后是.ToList()&#39; d。因此,根据实施中的确切用法,他们真的不需要IEnumerable<string>以外的任何内容。

答案 1 :(得分:1)

我最好的答案是SignalR在内部使用IList的增强功能,例如获取计数,或迭代集合以及您将用于IList但不使用ICollection的基于索引的访问的额外使用。使用更健壮的类的唯一原因是因为他们正在使用它,或者感觉需要其他功能。否则,我会假设使用较轻的ICollection类或IEnumerable的最佳实践,基本上是Enumerable-&gt; Collection-&gt; List heirarchy的基类。