Dictionary <t>?</t>的SingleOrDefault的集合版本是什么?

时间:2010-02-03 03:34:07

标签: c# .net collections dictionary extension-methods

标题类型说明了一切。我似乎无法找到DictionaryOrDefault \ ListOrDefault \ CollectionOrDefault选项。

有这样的方法吗?如果不是我该怎么做:

MyClass myObject = MyDictionary
    .SingleOrDefault(x =>
                        {
                            if (x.Value != null)
                                return (x.Value.Id == sourceField.SrcField.Id);
                            else
                                return false;
                        }).Key;

如果有多个匹配? (我得到了一个execption,因为SingleOrDefault仅用于单个结果(想象一下!)。)


猜猜我需要更清楚(虽然where答案看起来不错)。

我有上述声明。我改变了我的程序,使它不总是返回1(可能有几个值匹配一个键)。这失败了所以我正在寻找一个要返回的集合(而不仅仅是一个项目)。

2 个答案:

答案 0 :(得分:4)

如果您打算返回与谓词匹配的第一个,则可以使用IEnumerable<T>.FirstOrDefault(Func<T, bool> predicate)

否则,您只需查看IEnumerable<T>.Where(Func<T, bool> predicate) linq扩展,它将返回与传递的谓词匹配的所有元素。如果没有元素与谓词匹配,那将返回一个空IEnumerable<T>,此时如果你真的需要该值为null,你可以看看是否有任何内容。

var res = MyDictionary.Where(x => 
                        { 
                            if (x.Value != null)  
                                return (x.Value.Id == sourceField.SrcField.Id);  

                            return false;  
                        });
if (!res.Any())
    res = null;

然后,如果你绝对需要将它作为一个列表,你可以调用

res.ToList();

请注意,如果您实际操纵Dictionary<TKey, TValue>res将包含KeyValuePair<TKey, TValue>

答案 1 :(得分:1)

如果您执行类似

的操作
var mylist = obj.Where(x=>x.attr1 == 4);

然后,您可以使用.Any()方法检查是否返回了任何内容

mylist.Any()