通用字典检索值
本文关键字:检索 字典 | 更新日期: 2023-09-27 18:16:33
我有以下c#类:
class BatchData
{
public string batchNumber { get; set; }
public string processDate { get; set; }
public int TotalRecords { get; set; }
public int SuccessCount { get; set; }
}
和字典:
Dictionary<int, BatchData> BatchData = new Dictionary<int, BatchData>();
现在,我要搜索整个字典看看值
x
保存在:
BatchData.batchNumber
如
表示整个字典,if
BatchData.batchNumber = x
我知道Dictionary有一个方法
.contains
但是我不确定如何应用这个。
编辑:BatchData.batchNumber = x
可以在字典中出现多次
你可以这样做:
BatchData.Values.Any(x=>x.batchNumber == "x");
Dictionary<int, BatchData> BatchData = new Dictionary<int, BatchData>();
BatchData.Add(1, new BatchData { batchNumber = "x"});
var hasX = BatchData.Values.Any(x=>x.batchNumber == "x"); //true;
字典是KeyValuePair
对象的集合,每个对象都有一个Key
属性(在您的例子中是int
)和一个Value
属性(BatchData
对象)。
该批号可能有多个条目。如果您只想查看是否有键包含该数字,则可以使用
batchData.Any(kvp => kvp.Value.batchNumber == x);
如果您希望所有键值对与该批号,更改为Where
:
batchData.Where(kvp => kvp.Value.batchNumber == x);
您也可以根据需要使用First
、Single
等。
您应该使用batchNumber
作为字典的键:
Dictionary<string, BatchData> BatchData = new Dictionary<string, BatchData>();
BatchValues.Add(batch1.batchNumber, batch1);
BatchValues.Add(batch2.batchNumber, batch2);
BatchValues.Add(batch3.batchNumber, batch3);
...
那么检查存在性是一个O(1)操作(链接):
BatchValues.ContainsKey(batchNumber);
您可以使用System.Linq
中的Contains
方法的另一个解决方案。
IEqualityComparer<>
接口
public class BatchDataComparer : IEqualityComparer<KeyValuePair<int, BatchData>>
{
public bool Equals(KeyValuePair<int, BatchData> x, KeyValuePair<int, BatchData> y)
{
return (x.Value.batchNumber == y.Value.batchNumber);
}
public int GetHashCode(KeyValuePair<int, BatchData> obj)
{
//or something else what you need
return obj.Value.batchNumber.GetHashCode();
}
}
之后,您可以像这样从Dictionary中获取值:
private static void Main(string[] args)
{
Dictionary<int, BatchData> dic = new Dictionary<int, BatchData>();
dic.Add(1, new BatchData() { batchNumber = "x" });
dic.Add(2, new BatchData() { batchNumber = "y" });
dic.Add(3, new BatchData() { batchNumber = "z" });
bool contain = dic.Contains(new KeyValuePair<int, BatchData>(100, new BatchData()
{
batchNumber = "z"
}), new BatchDataComparer());
Console.ReadKey();
}
public class BatchData
{
public string batchNumber { get; set; }
public string processDate { get; set; }
public int TotalRecords { get; set; }
public int SuccessCount { get; set; }
}