能否用Dictionary替代List(Of KeyValuePair)存储POST表单数据?
在你的场景里,Dictionary(Of String, String) 确实是比List(Of KeyValuePair)更合适的选择——它原生支持键的快速查找,不用像List那样写Linq遍历两次来判断字段是否存在。不过有两个特殊情况需要注意,可能会影响你是否能替换:
特殊情况1:表单存在重复字段名
HTML表单允许同一个字段名出现多次(比如多选框的同名参数),如果你的业务需要保留所有重复字段的value(比如把多个值用逗号拼接,或者存为数组),那Dictionary就不适用了——因为Dictionary的键是唯一的,后面的键值对会直接覆盖前面的。这种情况下你还是得用List,或者改用Dictionary(Of String, List(Of String))来存储多值。
特殊情况2:需要严格保留表单字段的原始顺序
普通的Dictionary在旧版本.NET(比如.NET Framework 4.7.2及以前)不会保留键的插入顺序,而List(Of KeyValuePair)是完全按表单提交顺序存储的。如果你的业务要求JSON输出或者数据库存储的字段顺序必须和表单提交顺序一致,那普通Dictionary就不符合要求。不过如果用的是.NET Core 3.0+或者.NET 5+,默认的Dictionary已经会保留插入顺序;或者你可以用OrderedDictionary来兼容旧框架,不过OrderedDictionary的类型处理会麻烦一点。
适合替换场景下的代码修改
如果你的表单不存在重复字段,也不需要严格保留顺序,换成Dictionary后代码会更简洁高效:
Dim _FormData As New Dictionary(Of String, String) For Each item In FormData If (Not String.IsNullOrEmpty(item.Value)) AndAlso (Not String.IsNullOrEmpty(item.Key)) Then ' 若担心重复键,可先判断再处理,比如跳过或合并值 If Not _FormData.ContainsKey(item.Key) Then _FormData.Add(item.Key, item.Value) End If ' 如需处理重复键,比如拼接多个值: ' _FormData(item.Key) = If(_FormData.ContainsKey(item.Key), _FormData(item.Key) & "," & item.Value, item.Value) End If Next Dim JsonCapture = Newtonsoft.Json.JsonConvert.SerializeObject(_FormData) Dim FID = "" ' 直接用ContainsKey判断,一次查找搞定 If _FormData.ContainsKey("fid") Then FID = _FormData("fid") End If
对比原有代码,用Dictionary查找字段的时间复杂度从O(n)降到了O(1),代码也更简洁,无需两次Linq遍历。
内容的提问来源于stack exchange,提问作者DDulla

