【问题标题】:What is the collection version of SingleOrDefault for a Dictionary<T>?Dictionary<T> 的 SingleOrDefault 集合版本是什么?
【发布时间】:2011-01-12 11:15:04
【问题描述】:

标题说明了一切。我似乎找不到DictionaryOrDefault \ ListOrDefault \ CollectionOrDefault 选项。

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

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

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


我想我需要更清楚(尽管where 的答案看起来不错)。

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

【问题讨论】:

  • 这里有一点澄清,你试图获得许多适合谓词的值,或者只是一个,无论它是什么?
  • “标题说明了一切。”不是真的,DictionaryOrDefault 是什么意思?请仔细、清晰、正确地指定预期的语义。
  • 那么你想要的是如果没有匹配则返回 null 或者如果有一个或多个匹配则返回一个列表?

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


【解决方案1】:

如果您的意图是返回与谓词匹配的第一个,则可以使用IEnumerable&lt;T&gt;.FirstOrDefault(Func&lt;T, bool&gt; predicate)

否则,您只是查看IEnumerable&lt;T&gt;.Where(Func&lt;T, bool&gt; predicate) linq 扩展,它将返回与传递的谓词匹配的所有元素。如果没有元素与谓词匹配,这将返回一个空的IEnumerable&lt;T&gt;,此时如果您确实需要该值为空,您可以查看其中是否有任何内容。

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&lt;TKey, TValue&gt;res 将包含 KeyValuePair&lt;TKey, TValue&gt;

【讨论】:

  • 我觉得很愚蠢,因为我没有想到哪里。我只是被扭曲了。
【解决方案2】:

如果你做类似的事情

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

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

mylist.Any()

【讨论】:

  • 在需要之前不要调用 .ToList()。即使您知道自己马上需要它,也至少要留到下一行。
  • @Joel - 调用 ToList 有缺点吗? (我假设是这样,但从不知道......)
  • 是的,有缺点。 ToList() 强制立即迭代可枚举。它破坏了您可能从惰性评估中获得的任何优势。通过不调用 ToList(),您不会做任何真正的工作,直到您实际使用可枚举的地方,例如在 foreach 中。
  • 上面约翰的代码就是一个很好的例子。 ToList() 强制您遍历整个集合,即使 Any() 方法只关心是否有一个并且可以在序列中的第一项之后停止。
猜你喜欢
  • 1970-01-01
  • 2020-11-30
  • 2019-12-26
  • 1970-01-01
  • 2017-09-11
  • 2012-07-18
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多