相关疑难解决方法(0)

你如何按价值排序字典?

我经常需要按值排序字典,包括键和值.例如,我有一个单词的散列和各自的频率,我想按频率排序.

有一个SortedList对单个值(比如频率)有好处,我想将它映射回单词.

SortedDictionary按键排序,而不是值.有些人诉诸于自定义课程,但是有更清洁的方法吗?

.net c# sorting dictionary

770
推荐指数
15
解决办法
57万
查看次数

为什么检查字典是否包含密钥更快,而不是在不包含异常的情况下捕获异常?

想象一下代码:

public class obj
{
    // elided
}

public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Run Code Online (Sandbox Code Playgroud)

方法1

public static obj FromDict1(string name)
{
    if (dict.ContainsKey(name))
    {
        return dict[name];
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

方法2

public static obj FromDict2(string name)
{
    try
    {
        return dict[name];
    }
    catch (KeyNotFoundException)
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我很好奇这两个函数的性能是否存在差异,因为第一个函数应该比第二个函数更低 - 假设它需要在字典包含值时检查两次,而第二个函数确实只需要访问字典曾经但是WOW,它实际上是相反的:

循环1 000 000个值(现有10万个,不存在90 000个):

第一个功能:306毫秒

第二功能:20483毫秒

这是为什么?

编辑:你可以在下面这个问题的评论中注意到,如果有0个非现有密钥,第二个函数的性能实际上略好于第一个函数.但是,一旦存在至少一个或多个非现有密钥,则第二个密钥的性能会迅速下降.

c# performance dictionary

234
推荐指数
2
解决办法
13万
查看次数

获得通用词典的价值关键?

从.Net 2.0泛型字典中获取密钥的值很容易:

Dictionary<int, string> greek = new Dictionary<int, string>();
greek.Add(1, "Alpha");
greek.Add(2, "Beta");
string secondGreek = greek[2];  // Beta
Run Code Online (Sandbox Code Playgroud)

但有没有一种简单的方法来获取价值的关键?

int[] betaKeys = greek.WhatDoIPutHere("Beta");  // expecting single 2
Run Code Online (Sandbox Code Playgroud)

.net c#

119
推荐指数
4
解决办法
11万
查看次数

C#中的双向/双向字典?

我想以下列方式在单词中存储单词:

我可以逐字逐句地获取文字:dict["SomeWord"]- > 123并逐字逐句地获取:dict[123]- >"SomeWord"

这是真的吗?当然,一个办法做到这一点是两点字典:Dictionary<string,int>Dictionary<int,string>,但有另一种方式?

.net c# dictionary

77
推荐指数
7
解决办法
4万
查看次数

LINQ变换Dictionary <key,value> to Dictionary <value,key>

我有一个低脑波日...有没有人知道一种快速而优雅的方式来转换一个字典,以便键成为价值,反之亦然?

例:

var originalDictionary = new Dictionary<int, string>() {
    {1, "One"}, {2, "Two"}, {3, "Three"}
};
Run Code Online (Sandbox Code Playgroud)

var newDictionary = new Dictionary<string, int>();
// contents:  
// { 
//    {"One", 1}, {"Two", 2}, {"Three", 3} 
// };
Run Code Online (Sandbox Code Playgroud)

c# linq

38
推荐指数
2
解决办法
2万
查看次数

双向字典?

我有两组对象,在某些情况下,第一组将用作另一组的键,而在其他情况下,第二组将用作第一组的键.此外,两个列表中都不得有重复项.

什么是一个好的数据结构用于此?我应该使用两个字典还是有更聪明的方法?

c# data-structures

22
推荐指数
1
解决办法
2万
查看次数

C#中的多键词典(另一种)?

基于这个问题,是否有一个简单的解决方案,可以使用多键字典,其中任何一个键都可以用来识别值?

即.

MultikeyDictionary<TKey1, TKey2, TValue> foo;
foo.Add(key1, key2, value);
myValue = foo[key1];
// value == myValue
foo.Remove(key2);
myValue = foo[key1]; // invalid, Exception or null returned
Run Code Online (Sandbox Code Playgroud)

c# data-structures

9
推荐指数
1
解决办法
1万
查看次数

使用Where指定不同的泛型

我正在写一个双向字典类,但我想确保两个泛型类型不是同一类型,原因有两个.

首先,我希望它IDictionary在两个方向上实现接口,但是

public class BijectiveDictionary<TKey, TValue>
    : IDictionary<TKey, TValue>, IDictionary<TValue, TKey>
Run Code Online (Sandbox Code Playgroud)

给我"'BijectiveDictionary <TKey,TValue>'不能同时实现'IDictionary <TKey,TValue>'和'IDictionary <TValue,TKey>'因为它们可能统一某些类型参数替换"(这是可以理解的,但不可取的.)

其次,如果两种类型相同,我想编写一个优化的解决方案.

public class BijectiveDictionary<TKey, TValue>
    : IDictionary<TKey, TValue> where TValue : TKey
{
    // Optimized solution
}

public class BijectiveDictionary<TKey, TValue>
    : IDictionary<TKey, TValue>, IDictionary<TValue, TKey> where TValue : !TKey
{
    // Standard solution
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

如果没有,我可以考虑不实施IDictionary,但我无法保证TValue this[TKey key]并且TKey this[TValue key]会有所不同,这将是不幸的.


看起来这里的问题是当两种类型相同时,会出现特殊情况.

我的原意是要创造出准确映射一个键一个值,反之亦然,这样,每一个字典KeyValuePair<TKey, TValue>(X, Y),一个KeyValuePair<TValue, TKey>(Y, X)同样存在.

TKey=时TValue …

.net c# generics

9
推荐指数
1
解决办法
365
查看次数

如何在c#中使用字典两种方式

public static Dictionary<int, string> dic = new Dictionary<int, string>() { 
            {1,"anystring1"},
            {2,"anystring2"}};
Run Code Online (Sandbox Code Playgroud)

我需要用这个

string str= dic[1]; // it is possible

int a=dic["anystring1"]; // My dream is it
Run Code Online (Sandbox Code Playgroud)

c#

7
推荐指数
3
解决办法
2万
查看次数

具有两个不相等(唯一)类型的泛型类

是否可以实现一个约束为两个唯一通用参数的类?

如果不是,那是因为它没有实现,还是因为语言结构(继承)是不可能的?

我想要一些形式:

class BidirectionalMap<T1,T2> where T1 != T2
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

我正在实现双向字典.这主要是好奇心问题,而不是需要.


从评论中复述:

  1. 丹:"如果不满足这种约束,会有什么负面影响?"

  2. 我:"然后用户可以使用map [t1]和map [t2]进行索引.如果它们是相同的类型,则没有任何区别,也没有任何意义."

  3. Dan:编译器实际上允许[两个泛型类型参数来定义不同的方法重载],所以我很好奇; 它是否随意选择其中一种方法来调用?

c# generics constraints

7
推荐指数
1
解决办法
633
查看次数