我有(或想要)这样的代码:

IDictionary<string,int> dict = new Dictionary<string,int>();
// ... Add some stuff to the dictionary.

// Try to find an entry by value (if multiple, don't care which one).
var entry = dict.FirstOrDefault(e => e.Value == 1);
if ( entry != null ) { 
   // ^^^ above gives a compile error:
   // Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<string,int>' and '<null>'
}

我还试着像这样改变冒犯的台词:

if ( entry != default(KeyValuePair<string,int>) ) 

但这也会产生一个编译错误:

Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<string,int>' and 'System.Collections.Generic.KeyValuePair<string,int>'

这是怎么回事?

推荐答案

Jon的答案将适用于Dictionary<string, int>,因为字典中不能有空键值.然而,它不适用于Dictionary<int, string>,因为它没有空键值..."失败"模式将以0键结束.

有两种 Select :

写一个TryFirstOrDefault方法,如下所示:

public static bool TryFirstOrDefault<T>(this IEnumerable<T> source, out T value)
{
    value = default(T);
    using (var iterator = source.GetEnumerator())
    {
        if (iterator.MoveNext())
        {
            value = iterator.Current;
            return true;
        }
        return false;
    }
}

或者,投影到可为空的类型:

var entry = dict.Where(e => e.Value == 1)
                .Select(e => (KeyValuePair<string,int>?) e)
                .FirstOrDefault();

if (entry != null)
{
    // Use entry.Value, which is the KeyValuePair<string,int>
}

.net相关问答推荐

如何处理以用户为中心的CSP现时值?(uc-lock.bundle.js)

带有ASP.NET核心的Angular 项目模板.API试验

当数据大量分布在微服务中时,我应该如何设计后端?

更改列表中的值

线程安全性的单元测试?

既然 .NET 有一个垃圾收集器,为什么我们需要终结器/析构器/dispose-pattern?

我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

C# 有办法给我一个不可变的字典吗?

如何使用转储文件来诊断内存泄漏?

DateTime.TryParseExact() 拒绝有效格式

如何比较 C# 中的(目录)路径?

从 OpenFileDialog 路径/文件名中提取路径

如何在 Dapper.Net 中编写一对多查询?

MailMessage,Sender 和 From 属性的区别

对构造函数进行单元测试重要吗?

ValueTypes 如何从 Object (ReferenceType) 派生并且仍然是 ValueTypes?

/langversion 的错误选项6无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

作者主签名的时间戳发现了一个建链问题:UntrustedRoot: self-signed certificate in certificate chain

判断数据表中是否包含空值的最佳方法

什么时候使用 Tuple 和 KeyValuePair 比较好?