Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何阅读以字符串为键的词典_C#_Dictionary - Fatal编程技术网

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)
{
辞典