c# - 如果长度恰好为一个,或者否则为默认值,我如何获得 IEnumerable 的第一个值?

标签 c# linq generics ienumerable extension-methods

我想要类似 IEnumerable.FirstOrDefault 的东西,但我想要在 length != 1 时返回默认值。像 v.Count() == 1 这样的东西? v[0] :默认值。但我更愿意在不将整个可枚举对象转换为数组的情况下这样做。获得这种行为的最佳方式是什么?

最佳答案

Microsoft 对 Enumerable.FirstOrDefault 的实现直接与底层枚举器一起工作。你的也可以:

public static T FirstIfOnlyOne<T>(this IEnumerable<T> source, T defaultValue = default(T))
{
    // (Null check and IList<T> optimization omitted...)

    using (IEnumerator<T> enumerator = source.GetEnumerator())
    {
        if (enumerator.MoveNext()) // Is there at least one item?
        {
            T item = enumerator.Current; // Save it.
            if (!enumerator.MoveNext()) // Is that it?
                return item;
        }
    }
    return defaultValue;
}

这可能是最有效的实现方式。

关于c# - 如果长度恰好为一个,或者否则为默认值,我如何获得 IEnumerable 的第一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42323752/

相关文章:

c# - 如何在 NUnit 中编写需要括号的流畅约束

c# - 当我在 linq 中为 `Where` 条件使用具有基本类型的 lambda 创建程序时出现编译错误

c# - 如何在 LINQ 表达式的内部选择中有一个索引值?

java - Comparable Generic 如何使用 ist

java - Java 中菱形运算符 (<>) 的意义何在?

c# - RSA读取公钥

c# - 解码 Base64urlUInt 编码值

c# - 用户文本输入的乐观正则表达式匹配

c# - LINQ 除了运算符和对象相等

java - 如何将泛型添加到我的代码中