获取IEnumerable项的第一个元素

8

我从一个使用 yield return 循环的函数中返回了一个 IEnumerable<object[]> 元素。

public static IEnumerable<object[]> GetData()
{
        ...

        connection.Open();

        using (OleDbDataReader dr = command.ExecuteReader())
        {
            while (dr.Read())
            {
            object[] array = new object[dr.FieldCount];
                dr.GetValues(array);
            yield return array;
            }
        }

        connection.Close();
}

最好的方法是在不使用循环的情况下检索第一个元素。

var result = Adapter.GetData();
5个回答

15

简而言之:

enumerator=result.GetEnumerator();
enumerator.MoveNext();
enumerator.Current;

使用foreach循环可以遍历所有元素。

正确的方式:

using (IEnumerator<object[]> enumerator = result.GetEnumerator()) {
    if (enumerator.MoveNext()) e = enumerator.Current;

}

使用 LINQ:

var e = result.First();
或者
var e = result.FirstOrDefault(default);

另外:

var e = result.ElementAt(0);

这很好,谢谢。但是它让我遇到了另一个问题,那就是在 yield return 之后我关闭了 DB 连接,所以如果我两次调用该函数,它会引发异常,说之前的连接没有关闭。为什么使用 foreach 没有问题?我应该如何处理释放资源? - David Weng
你能说一下你用了什么来获取第一个元素吗? - manojlds
太棒了,我通过将“CloseConnection”行为传递给“ExecuteReader”函数来解决了它。现在一切都很顺利。非常感谢。 - David Weng
@David Weng - 你为什么要调用两次函数?简单来说,yield return 就像是一个暂停。在所有元素“yielded”之前,你的连接不会关闭。 - manojlds
@David Wenig - 为什么要使用(...)?我认为,枚举器不是 IDisposable。 - Georg

1
如果您的 .Net 版本是 3.5 或更高版本
Adapter.GetData().First()

0
enumerator=result.GetEnumerator();
enumerator.MoveNext();
enumerator.Current;

8
最高赞的回复实际上有完全相同的答案,很难错过。 - alex

0
    public static T FirstOrDefault<T>(this IEnumerable items) where T : class {
        var list = items.OfType<T>();
        if (list!= null) {
            return list.FirstOrDefault();
        }

        return default(T);
    }

0

你不能使用 result.First() 吗?


@DavidWeng:等一下,IEnumerable 没有 First() 方法吗?还是我完全误解了你的问题(可能是)? - alex
我是否缺少引用? 'System.Collections.Generic.IEnumerable<object[]>' 不包含 'First' 的定义,也没有接受类型为 'System.Collections.Generic.IEnumerable<object[]>' 的第一个参数的扩展方法 'First' 可以找到(您是否缺少使用指令或程序集引用?) - David Weng
@DavidWeng,请看这里:http://msdn.microsoft.com/zh-cn/library/bb291976.aspx。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接