通用字典检索值

时间:2015-10-07 15:28:01

标签: c# .net dictionary

我有以下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 

例如

整个字典,如果

BatchData.batchNumber = x

我知道Dictionary有一个方法

.contains

但我不确定如何应用此功能。

编辑:

BatchData.batchNumber = x

可以在字典中多次出现

4 个答案:

答案 0 :(得分:5)

你可以这样做:

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;

例如:

{{1}}

答案 1 :(得分:3)

字典是KeyValuePair个对象的集合,每个对象都有Key属性(在您的情况下为int)和Value属性(a { {1}}对象)。

该批次编号可能有多个条目。如果您只想查看任何键是否包含该号码,您可以使用

BatchData

如果您希望具有该批号的所有键值对,请更改为batchData.Any(kvp => kvp.Value.batchNumber == x);

Where

您也可以根据需要使用batchData.Where(kvp => kvp.Value.batchNumber == x); First等。

答案 2 :(得分:1)

您应该使用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)操作(link):

BatchValues.ContainsKey(batchNumber);

答案 3 :(得分:0)

您可以使用Contains中的System.Linq方法使用另一个解决方案。

首先,您需要实现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; }
}