如何将字符串组成字符串作为键

时间:2017-01-13 14:00:40

标签: c# dictionary

我有一个字典,其中包含字符串作为键,bool包含值,如

[{1,1 True}]
[{5,1 True}]
[{5,2 True}]
[{2,4 True}]

以下是我如何在Dictionary中添加值。

string DictKey = (j +","+ (iPageIndex - 1)).ToString();
PageVersusRowCheckboxStatus.Add(DictKey, true);

现在我需要根据Key的第二个值遍历字典的结果值。对于eaxmple,在上面的字典1,1和5,1是键。

我们是否可以根据上述共享密钥的第二个值进行循环,然后分别得到第一个,即1和5。

3 个答案:

答案 0 :(得分:2)

循环遍历PageVersusRowCheckboxStatus.Keys并拆分每一个。但是,您可能最好使用Tuple<int,int>作为键类型而不是字符串:

Dictionary<Tuple<int, int>, bool> PageVersusRowCheckboxStatus = 
    new Dictionary<Tuple<int, int>, bool>();

//...

var DictKey = new Tuple<int, int>(j, iPageIndex - 1);
PageVersusRowCheckboxStatus.Add(DictKey, true);


var q = 
    PageVersusRowCheckboxStatus.Keys
        .Where(t => t.Item2 == 1)
        .Select(t => t.Item1);

如果你使用一个字符串并一直分开它,你的代码就会被奇怪的东西弄得乱七八糟,每当你需要处理密钥的两个部分时,你必须记住分裂是如何工作的。如果使用具有两个int属性的类,则编写起来更容易,更容易调试,并且更易于维护。

这是一个问题:你在字典中使用bool值做什么?如果您只是将它们作为占位符放在那里,那么最好用

List<Tuple<int, int>>

HashSet<Tuple<int, int>>

@ O.R.Mapper指出,如果超效率不是一个大问题(并且通常不是这样),这可能非常简单有效:

List<Tuple<int, int, bool>>

如果您只是按页面索引查找内容,那么使用字典无法获得任何好处。您可以遍历所有键,但无法通过部分键查找值。事实上,这可能是你想要的:

var dict = new PageVersusRowCheckboxStatus();

dict.SetRowStatus(2, 1, true);
dict.SetRowStatus(2, 5, true);
dict.SetRowStatus(3, 5, true);
dict.SetRowStatus(4, 2, true);

// ...

//  Here's how to do the query that returns ( 1, 5 ) for page index key 1
int pageIndexKey = 1;
if (dict.ContainsKey(pageIndexKey))
{
    foreach (int row in dict[pageIndexKey].Keys)
    {
        //  Do something
    }
}

// ...

public class RowStatusDictionary : Dictionary<int, Dictionary<int, bool>>
{
    public void SetRowStatus(int pageIndex, int row, bool status)
    {
        Dictionary<int, bool> rowStatuses = null;

        int pageIndexKey = pageIndex - 1;

        if (!this.TryGetValue(pageIndexKey, out rowStatuses))
        {
            this[pageIndexKey] = new Dictionary<int, bool>();
        }

        rowStatuses[row] = status;
    }

    public bool GetRowStatus(int pageIndex, int row)
    {
        Dictionary<int, bool> rowStatuses = null;

        int pageIndexKey = pageIndex - 1;

        if (TryGetValue(pageIndexKey, out rowStatuses))
        {
            return rowStatuses[row];
        }

        return false;
    }
}

答案 1 :(得分:1)

我没有测试过,但你可以做类似的事情:

IEnumerable<string> keys = dict.Where(a => a.Key.Split(',')[1] == "1").Select(a => a.Key.Split(',')[0]);
用这个你就能得到你想要的东西。

注意:如果您想使用List<T>代替IEnumerable<T>,那么您可以使用ToList()扩展方法

答案 2 :(得分:0)

如果要在字典键中包含两个值,更好的解决方案可能是使您的键类型为Tuple<int, int>而不是逗号分隔的字符串。或者可能只是一个自定义类

public class DictKey{ public int row {get; set;} public int pageIndex {get; set;} }

您可能需要考虑完全忽略该页面,并为每个复选框指定自己的ID,而不管它在哪个页面上。