将 ContainsKey 方法与变量一起使用
Usage of ContainsKey method with a variable
我有一个包含一些值的字符串变量,我希望能够检查该字符串是否作为键及其变量名称存在于字典中。
为了更清楚地理解,您可以在以下代码中看到;
string searchDuration = "200";
var response = new Dictionary<string, string>()
{
{"searchDuration","200"},
{"minRssi", "-70"},
{"optionalFilter","NO_FILTERS_ACTIVE_SCANNING"},
{"txPowerLevel","200"},
{"peripheralId","123wrong"}
};
我可以按如下方式使用 ContainsKey 方法;
if (response.ContainsKey("searchDuration"))
if (searchDuration == pair.Value)
isEqual = true;
但我不会(实际上不能)这样使用它,因为;
- 我需要动态传入每一个字符串变量,我不能把每一个变量名都写成一个字符串传给ConstainsKey方法
- 它只检查值,并且可能有多个值带有“200”,这种情况会给我错误的结果。
- 我只想将值“200”与相关键“searchDuration”进行比较,而不是与具有相同值的“txPowerLevel”进行比较。
有没有办法检查字符串变量是否作为键存在于字典中,以便将它的值与字典成员进行比较?
我建议采用这种方法:
string searchDuration = "200";
var response = new Dictionary<string, string>()
{
{"searchDuration","200"},
{"minRssi", "-70"},
{"optionalFilter","NO_FILTERS_ACTIVE_SCANNING"},
{"txPowerLevel","-16"},
{"peripheralId","123wrong"}
};
var wasItThere = response.TryGetValue(nameof(searchDuration), out var value);
Console.WriteLine(wasItThere && (value == searchDuration));
TryGetValue
优于 ContainsKey
因为它在检查密钥是否存在的同时获取值。
nameof
用于将变量名转换为其字符串表示。
我已明确 未 使用 pair.Value
因为您原始问题中的代码强烈暗示您正在迭代 Dictionary
。这不是一个好主意(性能方面)。
如果您要比较的变量都是对象的一部分,那么您可以使用反射检查该对象,并将对象内部找到的内容与字典中存在的内容进行比较。方法如下:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var obj = new { searchDuration = "200", txPowerLevel = "100", other = "123"};
var stringProperties = obj
.GetType()
.GetProperties()
.Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
.Select(pi => new
{
Name = pi.Name,
Value = pi.GetGetMethod().Invoke(obj, null)}
)
.ToList();
var response = new Dictionary<string, string>()
{
{"searchDuration","200"},
{"minRssi", "-70"},
{"optionalFilter","NO_FILTERS_ACTIVE_SCANNING"},
{"txPowerLevel","200"},
{"peripheralId","123wrong"}
};
foreach (var item in stringProperties)
{
string v;
response.TryGetValue(item.Name, out v);
Console.WriteLine(item.Name + ": obj value=" + item.Value + ", response value=" + (v ?? "--N/A--"));
}
}
}
工作Fiddle:https://dotnetfiddle.net/gUNbRq
如果这些项目作为局部变量存在,那么它也可以完成(例如参见here),但我建议将它放在对象中以将您要检查的值与其他变量分开你的方法需要和使用。
我有一个包含一些值的字符串变量,我希望能够检查该字符串是否作为键及其变量名称存在于字典中。 为了更清楚地理解,您可以在以下代码中看到;
string searchDuration = "200";
var response = new Dictionary<string, string>()
{
{"searchDuration","200"},
{"minRssi", "-70"},
{"optionalFilter","NO_FILTERS_ACTIVE_SCANNING"},
{"txPowerLevel","200"},
{"peripheralId","123wrong"}
};
我可以按如下方式使用 ContainsKey 方法;
if (response.ContainsKey("searchDuration"))
if (searchDuration == pair.Value)
isEqual = true;
但我不会(实际上不能)这样使用它,因为;
- 我需要动态传入每一个字符串变量,我不能把每一个变量名都写成一个字符串传给ConstainsKey方法
- 它只检查值,并且可能有多个值带有“200”,这种情况会给我错误的结果。
- 我只想将值“200”与相关键“searchDuration”进行比较,而不是与具有相同值的“txPowerLevel”进行比较。
有没有办法检查字符串变量是否作为键存在于字典中,以便将它的值与字典成员进行比较?
我建议采用这种方法:
string searchDuration = "200";
var response = new Dictionary<string, string>()
{
{"searchDuration","200"},
{"minRssi", "-70"},
{"optionalFilter","NO_FILTERS_ACTIVE_SCANNING"},
{"txPowerLevel","-16"},
{"peripheralId","123wrong"}
};
var wasItThere = response.TryGetValue(nameof(searchDuration), out var value);
Console.WriteLine(wasItThere && (value == searchDuration));
TryGetValue
优于 ContainsKey
因为它在检查密钥是否存在的同时获取值。
nameof
用于将变量名转换为其字符串表示。
我已明确 未 使用 pair.Value
因为您原始问题中的代码强烈暗示您正在迭代 Dictionary
。这不是一个好主意(性能方面)。
如果您要比较的变量都是对象的一部分,那么您可以使用反射检查该对象,并将对象内部找到的内容与字典中存在的内容进行比较。方法如下:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var obj = new { searchDuration = "200", txPowerLevel = "100", other = "123"};
var stringProperties = obj
.GetType()
.GetProperties()
.Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
.Select(pi => new
{
Name = pi.Name,
Value = pi.GetGetMethod().Invoke(obj, null)}
)
.ToList();
var response = new Dictionary<string, string>()
{
{"searchDuration","200"},
{"minRssi", "-70"},
{"optionalFilter","NO_FILTERS_ACTIVE_SCANNING"},
{"txPowerLevel","200"},
{"peripheralId","123wrong"}
};
foreach (var item in stringProperties)
{
string v;
response.TryGetValue(item.Name, out v);
Console.WriteLine(item.Name + ": obj value=" + item.Value + ", response value=" + (v ?? "--N/A--"));
}
}
}
工作Fiddle:https://dotnetfiddle.net/gUNbRq
如果这些项目作为局部变量存在,那么它也可以完成(例如参见here),但我建议将它放在对象中以将您要检查的值与其他变量分开你的方法需要和使用。