通用字典检索值

本文关键字:检索 字典 | 更新日期: 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);

您也可以根据需要使用FirstSingle等。

您应该使用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; }
}