Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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#_C# 4.0 - Fatal编程技术网

C# 如何获取字典元素的相对位置?

C# 如何获取字典元素的相对位置?,c#,c#-4.0,C#,C# 4.0,我有下一个C代码: 其中a,b,c,d,e,。。。是字典“d”的键,n4、n2、n3、n9是第二本字典的键 我怎样才能得到这个呢?在字典中没有“位置”这样的东西,它是无序的集合 有一些类似的集合按键和排序。请注意,它们是按键排序的,而不是按插入时间排序的。不清楚您想要哪个。字典没有隐含的键值对顺序。如果你需要“位置”,你就用错了 编辑时:如果要实现矩阵,最好使用多维数组。例如: int[,] matrix = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} };

我有下一个C代码:

其中a,b,c,d,e,。。。是字典“d”的键,n4、n2、n3、n9是第二本字典的键


我怎样才能得到这个呢?

字典中没有“位置”这样的东西,它是无序的集合


有一些类似的集合按键和排序。请注意,它们是按键排序的,而不是按插入时间排序的。不清楚您想要哪个。

字典没有隐含的键值对顺序。如果你需要“位置”,你就用错了

编辑时:如果要实现矩阵,最好使用多维数组。例如:

int[,] matrix = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} };
等效于如下矩阵:

1 2
3 4
5 6

您可以使用
矩阵[i][j]
访问其元素;例如
矩阵[0][0]
是1,
矩阵[0][1]
是2,等等。

如果您真的在寻找该功能,为什么不维护一个辅助数据结构来维护添加元素的顺序呢

(或)

可能您只想维护一个存储

   [{"a",-1},{"b",1},{"c",0},{"d",-1},{"e",-9}]

您将无法使用任何内置的集合数据结构,包括
KeyedCollection
。但是,通过从
collection
派生,您可以轻松创建自己的collection类,该类内部包含一个
字典,用于快速查找键。
集合
类本身提供了索引检索功能

public class KeyValueCollection<TKey, TValue> : Collection<KeyValuePair<TKey, TValue>>
{
    private Dictionary<TKey, TValue> m_Dictionary = new Dictionary<TKey, TValue>();

    public TValue GetValue(TKey key)
    {
        return m_Dictionary[key];
    }

    public void Add(TKey key, TValue value)
    {
        m_Dictionary.Add(key, value);
        base.Add(new KeyValuePair<TKey, TValue>(key, value));
    }

    protected override void ClearItems()
    {
        m_Dictionary.Clear();
        base.ClearItems();
    }

    protected override void InsertItem(int index, KeyValuePair<TKey, TValue> item)
    {
        m_Dictionary.Add(item.Key, item.Value);
        base.InsertItem(index, item);
    }

    protected override void RemoveItem(int index)
    {

        m_Dictionary.Remove(this[index].Key);
        base.RemoveItem(index);
    }

    protected override void SetItem(int index, KeyValuePair<TKey, TValue> item)
    {
        m_Dictionary[this[index].Key] = item.Value;
        base.SetItem(index, item);
    }
}
public类KeyValueCollection:集合
{
私有字典m_Dictionary=新字典();
公共TValue GetValue(TKey)
{
返回m_字典[键];
}
公共无效添加(TKey键,TValue值)
{
m_Dictionary.Add(键、值);
添加(新的KeyValuePair(key,value));
}
受保护的覆盖无效ClearItems()
{
m_Dictionary.Clear();
base.ClearItems();
}
受保护的重写void插入项(int索引,KeyValuePair项)
{
m_Dictionary.Add(item.Key,item.Value);
基本插入项(索引,项目);
}
受保护的覆盖void removietem(int索引)
{
m_Dictionary.Remove(此[index].Key);
基本删除项(索引);
}
受保护的覆盖无效SetItem(int索引,KeyValuePair项)
{
m_Dictionary[this[index].Key]=item.Value;
base.SetItem(索引,项);
}
}

这应该可以做到:

d.Keys.ToList().IndexOf("c");
请注意,当转换到列表时,字典提供的O(1)时间查找将丢失,因为列表本身就是O(n)。因此,如果字典中有大量元素,那么最好使用另一个字典或矩阵维度来存储位置,因为以这种方式检索位置可能会比较慢。事实上,您可能应该假设上面的一行与:

GetDictKeyPos(d, "c");

public int GetDictKeyPos(Dictionary<string, int> d, string key)
{
    for (int i = 0; i < d.Count; ++i)
    {
        if (d.ElementAt(i).Key == key)
            return i;
    }
    return -1;
}
GetDictKeyPos(d,“c”);
public int GetDictKeyPos(字典d,字符串键)
{
对于(int i=0;i
作为旁注,如果您试图获得该职位,您可能会假设该职位得到保留。微软说不要指望它,但在实践中你会发现你可能可以指望它。(我从未见过这种立场不被保留。)话虽如此,直到微软承认,“是的,是的,我们一直在向你们隐瞒:这个位置实际上保存在一本字典里。我们只是不想承认这一点,因为如果我们找到了更好的实现,我们希望能够对其进行更改,但现在我们知道我们将要放弃它,所以,现在……你可能不应该假设这个位置是保留的


最后,如果你正打算抓住机会并假设它被保存,并且你也计划使用上面的方法来获得这个位置,那么考虑把密钥存储在一个列表中,因为查找时间是相同的,并且保证了列表的顺序。

为什么你需要这样的东西?这是一个实现细节。l这只有在实现使用索引时才重要(可能不是)。Jon,谢谢你的回答,我在问题中添加了我想要的内容;希望这对回答有帮助。我的问候。@user255053:我恐怕还不太清楚你所说的“相对位置”是什么意思“。这是由键决定的,还是由条目插入的顺序决定的?Jon,如果我不清楚,非常抱歉。”。我添加了一个我想要得到的结果的例子,矩阵的值是任意的,正如你所看到的,并不是这个矩阵的所有单元格都被填满。@JonSkeet:我很惊讶这么说,但我想我不同意你的说法,字典中没有位置这样的东西。ElemantAt(int)获取特定位置的元素,因此位置的概念必须存在。这些立场是否有意义是另一个问题。(尽管它们似乎确实代表插入顺序。)@TTT:文档明确指出:“返回项目的顺序未定义。”它可以随时更改。这就像试图将意义附加到
GetHashCode
返回的值上-如果愿意,可以这样做,但这是一个非常糟糕的主意。在两次调用之间更改
ElementAt(0)
返回的值是完全合理的。是的,有一种方法可以将其视为有序的集合,但这样做是一个坏主意,因为有序并不是集合概念中固有的。谢谢,我在该解决方案中考虑过,但我想知道是否可以找到一种更好的通用方法,因为根据我对问题的补充,我使用第二个dicconary,也就是说,我还需要知道相对位置。问候。@用户为什么不使用多维字符串数组呢?我再次修改了我的问题以给出答案
d.Keys.ToList().IndexOf("c");
GetDictKeyPos(d, "c");

public int GetDictKeyPos(Dictionary<string, int> d, string key)
{
    for (int i = 0; i < d.Count; ++i)
    {
        if (d.ElementAt(i).Key == key)
            return i;
    }
    return -1;
}