我有一个字典,其中包含字符串作为键,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。
答案 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,而不管它在哪个页面上。