Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Signal在其合同中以及在其内部的任何地方使用IList而不是IEnumerable?_C#_Signalr - Fatal编程技术网

C# 为什么Signal在其合同中以及在其内部的任何地方使用IList而不是IEnumerable?

C# 为什么Signal在其合同中以及在其内部的任何地方使用IList而不是IEnumerable?,c#,signalr,C#,Signalr,我将根据个人用户的角色向他们发送消息,以实现以下目的: public static void Add(Guid userId, IEnumerable<SnapshotItem> snapshot) { var hub = GlobalHost.ConnectionManager.GetHubContext<FeedbackHub>(); var items = ApplicationDbContext.Instance.InsertSnapshot(u

我将根据个人用户的角色向他们发送消息,以实现以下目的:

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);
    }
}
publicstaticvoidadd(Guid用户ID,IEnumerable快照)
{
var hub=GlobalHost.ConnectionManager.GetHubContext();
var items=ApplicationDbContext.Instance.InsertSnapshot(userId,Guid.NewGuid(),snapshot);
foreach(ConnectedUsers.Instance.EnumerateSendOperations(items)中的var SendOperations)
{
hub.Clients.Users(sendOperation.Groups.SelectMany(x=>x.Users.Select(x=>x.Id.ToList()).OnDataFeedback(sendOperation.Items);
}
}
我不知道为什么每次我需要发送东西时都要调用
.ToList()
,我的备份存储是
HashSet
,我希望signar使用这种类型的存储,而不是每次都将其转换为
List
,因为它显然会消耗处理能力和内存

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


编辑


在SignalR github页面上创建了一个问题,将不得不等待一个实际的开发人员来解决问题…

就我所能看到的挖掘旧的源代码而言,没有什么好的理由。具有讽刺意味的是,
IList
被交给了
MultipleSignalProxy
类,然后就是
.ToList()
'd。因此,基于实现中的确切用法,他们只需要
IEnumerable

我最好的答案是,SignalR在内部使用IList的增强功能,如获取计数,或迭代集合,并额外使用IList使用的基于索引的访问,但不是我收集的。使用更健壮的类的唯一原因是因为他们在某处使用它,或者觉得需要额外的功能。否则,我将假设使用较轻的ICollection类或IEnumerable的最佳实践,基本上是可枚举->集合->列表继承权的基类


G

好吧,你必须让开发者得到正确的答案,对吗?我必须先问Stackoverflow,对吗?;)但是你的问题被问到的方式,没有人能真正回答它,除非真正的开发者出现来回答it@Patrick不一定,对源代码有足够了解的人可以解释。@Groo:在任何情况下,系统都会保留引用,直到任务完成为止,至于等待signar的开发人员,我想说以下几点:如果你没什么可说的,什么也不说:)这不是最大的问题,但是,我看到
公共抽象类订阅:ISubscription,IDisposable
包含
公共IList事件密钥{get;private set;}
属性,该属性稍后通过
私有bool AddEventCore(字符串键)
公共虚拟void RemoveEvent(字符串键)
,特别是
事件键。包含(键)
事件键。添加(键)
事件键。删除(键)发出了调用,这些是什么?我看到信号器中有这么多ToList操作,但不知道为什么会发生这种情况看起来很可怕,与NodeJS Socket.io实现相比,信号器看起来像是一个过度杀伤力。。。