C# 如何阅读以字符串为键的词典
我有一本字典,它把字符串作为键,布尔作为值C# 如何阅读以字符串为键的词典,c#,dictionary,C#,Dictionary,我有一本字典,它把字符串作为键,布尔作为值 [{1,1 True}] [{5,1 True}] [{5,2 True}] [{2,4 True}] 下面是我如何将值添加到字典中的 string DictKey = (j +","+ (iPageIndex - 1)).ToString(); PageVersusRowCheckboxStatus.Add(DictKey, true); 现在我需要根据键的第二个值遍历dictionary的结果值 是否有一种方法可以基于上述共享密钥的第二个值(即
[{1,1 True}]
[{5,1 True}]
[{5,2 True}]
[{2,4 True}]
下面是我如何将值添加到字典中的
string DictKey = (j +","+ (iPageIndex - 1)).ToString();
PageVersusRowCheckboxStatus.Add(DictKey, true);
现在我需要根据键的第二个值遍历dictionary的结果值
是否有一种方法可以基于上述共享密钥的第二个值(即和)循环,并分别获得第一个值(即1和5)。我还没有测试,但您可以执行类似的操作:
IEnumerable<string> keys = dict.Where(a => a.Key.Split(',')[1] == "1").Select(a => a.Key.Split(',')[0]);
IEnumerable keys=dict.Where(a=>a.Key.Split(',')[1]==“1”)。选择(a=>a.Key.Split(',')[0]);
有了这个你会得到你想要的
注意:如果您想使用
List
而不是IEnumerable
,则可以使用ToList()
扩展方法我还没有测试过,但您可以执行类似的操作:
IEnumerable<string> keys = dict.Where(a => a.Key.Split(',')[1] == "1").Select(a => a.Key.Split(',')[0]);
IEnumerable keys=dict.Where(a=>a.Key.Split(',')[1]==“1”)。选择(a=>a.Key.Split(',')[0]);
有了这个你会得到你想要的
注意:如果要使用
List
而不是IEnumerable
,则可以使用ToList()
扩展方法通过PageVersusRowCheckboxStatus.键循环并拆分每个键。但是,最好使用Tuple
作为键类型,而不是字符串:
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);
字典页面VersusRowCheckboxStatus=
新字典();
//...
var DictKey=新元组(j,iPageIndex-1);
PageVersusRowCheckboxStatus.Add(DictKey,true);
变量q=
PageVersusRowCheckBox状态。键
.其中(t=>t.Item2==1)
.选择(t=>t.Item1);
如果你一直使用一个字符串并拆分它,你的代码就会被一些奇怪的东西弄得乱七八糟,每次你需要处理键的两个部分时,你就必须记住拆分是如何工作的。如果使用具有两个int属性的类,那么编写、调试和维护都会更容易
不过,这里有一个问题:你对字典中的布尔值做了什么?如果你只是把它们作为一个占位符放在那里,你可能会更好
List<Tuple<int, int>>
列表
或
HashSet
@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;
}
}
var dict=new PageVersusRowCheckboxStatus();
dict.SetRowStatus(2,1,true);
dict.SetRowStatus(2,5,true);
dict.SetRowStatus(3,5,true);
dict.SetRowStatus(4,2,true);
// ...
//下面是如何执行返回(1,5)页面索引键1的查询
int pageIndexKey=1;
if(dict.ContainsKey(pageIndexKey))
{
foreach(dict[pageIndexKey].Keys中的int行)
{
//做点什么
}
}
// ...
公共类RowStatusDictionary:字典
{
public void SetRowStatus(int pageIndex、int行、bool状态)
{
字典行状态=空;
int pageIndexKey=pageIndex-1;
如果(!this.TryGetValue(pageIndexKey,out RowStatus))
{
此[pageIndexKey]=新字典();
}
行状态[行]=状态;
}
公共bool GetRowStatus(int-pageIndex,int-row)
{
字典行状态=空;
int pageIndexKey=pageIndex-1;
if(TryGetValue(pageIndexKey,输出行状态))
{
返回行状态[行];
}
返回false;
}
}
循环浏览PageVersusRowCheckboxStatus.键
并拆分每个键。但是,最好使用Tuple
作为键类型,而不是字符串:
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);
字典页面VersusRowCheckboxStatus=
新字典();
//...
var DictKey=新元组(j,iPageIndex-1);
PageVersusRowCheckboxStatus.Add(DictKey,true);
变量q=
PageVersusRowCheckBox状态。键
.其中(t=>t.Item2==1)
.选择(t=>t.Item1);
如果你一直使用一个字符串并拆分它,你的代码就会被一些奇怪的东西弄得乱七八糟,每次你需要处理键的两个部分时,你就必须记住拆分是如何工作的。如果使用具有两个int属性的类,那么编写、调试和维护都会更容易
不过,这里有一个问题:你对字典中的布尔值做了什么?如果你只是把它们作为一个占位符放在那里,你可能会更好
List<Tuple<int, int>>
列表
或
HashSet
@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;
}
}
var dict=new PageVersusRowCheckboxStatus();
dict.SetRowStatus(2,1,true);
dict.SetRowStatus(2,5,true);
dict.SetRowStatus(3,5,true);
dict.SetRowStatus(4,2,true);
// ...
//下面是如何执行返回(1,5)页面索引键1的查询
int pageIndexKey=1;
if(dict.ContainsKey(pageIndexKey))
{
foreach(dict[pageIndexKey].Keys中的int行)
{
//做点什么
}
}
// ...
公共类RowStatusDictionary:字典
{
public void SetRowStatus(int pageIndex、int行、bool状态)
{
字典行状态=空;
int pageIndexKey=pageIndex-1;
如果(!this.TryGetValue(pageIndexKey,out RowStatus))
{
此[pageIndexKey]=新字典();
}
行状态[行]=状态;
}
公共bool GetRowStatus(int-pageIndex,int-row)
{
辞典