Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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# 数据类型比以字符串为键、列表为值的字典更好_C# - Fatal编程技术网

C# 数据类型比以字符串为键、列表为值的字典更好

C# 数据类型比以字符串为键、列表为值的字典更好,c#,C#,我有一本字典,其中键是字符串;而值是一个浮动列表 key = "Sensor1"; values = new List<float>{0.4, 0.5, 0.2, 0.4}; key=“Sensor1”; 值=新列表{0.4,0.5,0.2,0.4}; 这是我可以用于我的案例的最佳数据结构吗?我关心的是解析值列表所花费的时间(我会经常解析它,两者都是读的而不是写的),但是除了一个字典中有值列表之外,我看不到其他方法 编辑 40个传感器每秒读取10次数值;我读取了所有这些值,并将包

我有一本字典,其中键是字符串;而值是一个浮动列表

key = "Sensor1";
values = new List<float>{0.4, 0.5, 0.2, 0.4};
key=“Sensor1”;
值=新列表{0.4,0.5,0.2,0.4};

这是我可以用于我的案例的最佳数据结构吗?我关心的是解析值列表所花费的时间(我会经常解析它,两者都是读的而不是写的),但是除了一个字典中有值列表之外,我看不到其他方法

编辑 40个传感器每秒读取10次数值;我读取了所有这些值,并将包含值和键的列表保存在字典中。
在某些情况下,必须更换每个传感器列表中的值。整个过程相当复杂,;这是最快的总结方式;希望是清楚的。

通常是
字典
主要用于此类任务,如果您的数据结构允许,它非常快,因为表示法是O(1)

我建议查看
HashSet
,它可能对您的案例更有效


可以找到
字典
列表
哈希集
之间的比较。

如果列表表示共享某些常见行为的相关值,则可以将此列表封装在类中:

class SensorData {
    public IList<float> Values {get;}
    public SensorData(IEnumerable<float> values) {
        Values = values.ToList();
    }
    // Add some useful methods that operate on Values here
    ...
}
类传感器数据{
公共IList值{get;}
公共传感器数据(IEnumerable值){
Values=Values.ToList();
}
//在此添加一些对值进行操作的有用方法
...
}
而不是现在

IDictionary<string,List<float>>
IDictionary
你会

IDictionary<string,SensorData>
IDictionary

这可能会提高代码的可读性。

对于所描述的数据类型,您需要使用某种哈希映射, 实现哈希映射有多种方法(如c#dictionary), 例如,在每个键中,可以将值保存为树(二进制、红色/黑色、…)、链表、排序数组等。。 还需要选择一个需要非常快的哈希函数。 我相信微软能以最佳方式实现字典,并具有合适的性能。

不确定“解析值列表”是什么意思,但可能您正在寻找


它类似于
字典
。您可以按键对项目进行分组,并按此键访问集合

如果您的意思是parsing=enuming,那么这两种数据结构都用于示例中预期的内容,因此可能是。。。你的目标是什么?数百万个元素,性能关键性?“这是我可以用于我的案例的最佳数据结构吗?”最佳用途是什么?您根本没有解释您的案例或您想如何使用它。让我举一个例子:每个传感器返回保存在列表中的N个值;我的应用程序的第一步是每隔一段时间读取这些值,将它们保存在列表中,然后在字典中创建条目;对于每个传感器,等等。第二步,调用键,读取列表中的每个值,并用传感器的新读数替换最低值。这意味着每个周期我都要读写多次。我确实每秒在40个传感器上采集10次样本,因此每秒采集400个样本。从使用场景来看,这看起来不是字典中的重要部分,而是保存每个键的值的数据结构。我认为你提出这个问题的方式是误导性的,大多数答案将(而且确实)集中在关键的查找部分。@IvanStoev correct;我认为这个问题很清楚,因为我想问的是,对于经常读写值的场景,这种数据结构的性能是否足够;所以你认为这是最大的价值,1变为常数并被丢弃。在列表中搜索值所需的时间不再是1,而是找到与传递的键相关的列表的时间。有趣的方法是,它增加了复杂性,因为我需要另一个类,但我可以添加与如何读取和修改列表值相关的逻辑。顺便问一下,使用IList有什么特别的原因吗?Thanks@newbiez我更喜欢对字段使用接口而不是类类型,以避免将自己锁定在集合的特定实现中。我最初是这样做的,在课堂上经常是这样。在极少数情况下,当我需要
List
中的方法时,如果
IList
上没有这些方法(例如,用于添加一系列值),我会将类型更改回
List
@newbiez。只要增加复杂性,当列表开始像一个有意义的东西一样运行时,它会很快获得更好的可读性。额外内存方面的开销最小,但可读性影响通常更为重要。