【发布时间】:2020-11-26 16:07:00
【问题描述】:
换句话说 - 我如何在不迭代“GetEnumerator()”的值 (O(n)) 的情况下获得它?
例如,假设我创建了以下有序字典(名为 aOrdDict),其中包含以下对:
INDEX KEY VALUE
0 testKey1 testValue1
1 testKey2 testValue2
2 keyToDelete valueToDelete
3 testKey3 testValue3
我如何在 aOrdDict.GetEnumerator() 中显示“testKey3”的索引为 3,而无需执行以下排序:
int i = 0;
var ListedPairs = aOrdDict.GetEnumerator();
string wantedKey = "testKey3";
for(; i < aOrdDict.Keys.Count; i++)
{
if (ListedPairs.key == wantedKey)
break;
listedPairs.MoveNext();
}
编辑 - 临时解决方案和一些上下文
对导致我的问题的风景进行了一些详细说明,并附有我实施的临时解决方案(类似于 Martin Liversage 在 cmets 上提出的建议):
我主要从事一些双向客户端服务器中介。 在服务器->客户端消息进入调解器并处理后, 在将其转发给客户端后,它的主体和 DateTime.Now() 值(低至毫秒)都在那个时刻 应该相互关联地存储在中介器中,打包,然后发送给客户端。
稍后,客户端向服务器发送请求,每个请求都带有特定的时间戳。
它期望接收一些存储值的范围,这些值是相邻且按时间顺序优先的 到输入时间戳。在那个阶段,订购的字典应该会派上用场 通过允许我通过键来处理存储在“timeStamp”的值(因此 - 需要一个字典),然后迭代 向后,逐个值,以与插入它们的顺序相反的顺序。 (因此 - 需要一个列表)
最终 - 我使用了:
ConcurrentDictionary<string, int> aIndicesDict
对于一对 {timeStamp, index} 对和一个
List<Tuple<string, someObject>> aSomeObjectsList
对于(时间戳,messageBody)对,
每次收到新消息时都将传入的值存储在两个集合中 从服务器发送到客户端。
然后,根据从客户端到服务器的传入请求,我们获得与输入时间戳相关的索引(来自 aIndicesDict - O(1)),允许我们从元组列表的相关索引开始向后迭代(在 aSomeObjectsList - O(1) 内直接进入相关的列表条目)。
正如我在 cmets 中所写的 - 我仍然想找到一个更有效的解决方案(内存方面)。
【问题讨论】:
标签: c# time-complexity ordereddictionary