LINQ 标准查询操作符(5)


using (NorthwindDataContext db = new NorthwindDataContext())
{
db.Log = Console.Out; //将生成的T-SQL语句输出到控制台中
//方法语法
var q =
db.Products
.ToLookup
(
p => p.CategoryID,
p => p.ProductName
);
foreach (var item in q)
{
Console.WriteLine(item.Key);
foreach (var p in item)
{
Console.WriteLine(p);
}
}
}


可以看出,ToLookup操作与GroupBy操作很相似,只不过GroupBy是延迟加载的,而ToLookup是即使加载。
十一、元素操作符
元素操作符将从一个序列中返回单个指定的元素。
1. First
First操作将返回序列中的第一个元素。如果序列中不包含任何元素,则First<T>方法将引发异常。若要在源序列为空时返回默认值,需要使用FirstOrDefault方法。以下代码演示了First<T>方法的使用方式:

复制代码 代码如下:


using (NorthwindDataContext db = new NorthwindDataContext())
{
db.Log = Console.Out; //将生成的T-SQL语句输出到控制台中
//无参
var query =
db.Employees
.First();
//有参
var q =
db.Employees
.First(e => e.FirstName.StartsWith("S"));
Console.WriteLine(q.FirstName);
}


上述代码中使用了First<T>方法的无参方式与有参方式。First<T>的有参方式中可以指定一个条件,操作将返回序列中满足此条件的第一个元素。从查询结果上看,source.First<T>(条件)方法与source.Where(条件).First<T>()是一样的,但是需要注意“First<T>(条件)操作将返回序列中满足此条件的第一个元素”,这将忽略后面的遍历操作,效率更高。
2. FirstOrDefault
FirstOrDefault方法将返回序列中的第一个元素;如果序列中不包含任何元素,则返回默认值。它也可以像First方法一样传递一个条件。需要说明的是如果序列中不包含任何元素,返回的默认值是个怎样的元素。在这之前,先来看一下FirstOrDefault方法是如何实现的:

复制代码 代码如下:


public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
if (list.Count > 0)
{
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return enumerator.Current;
}
}
}
return default(TSource);
}


1. 如果调用FirstOrDefault方法的序列为空,抛出异常
2. 如果序列成功转换为List<T>,并且元素数量大于0,则返回首个元素
3. 如果序列没有成功转换为List<T>,则尝试获取序列的遍历器,然后再调用遍历器的MoveNext方法,如果返回值为true,则返回当前的元素。
4. 如果上述操作都没有执行,则使用default(T)关键字返回类型T的默认值
以下给出MSDN中,对于default(T)关键字的描述:
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:
T 是引用类型还是值类型。
如果 T 为值类型,则它是数值还是结构。
给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回 null,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或 null 的每个结构成员,具体取决于这些结构是值类型还是引用类型。
3. Last
Last方法将返回序列中的最后一个元素。使用方法参照First。
4. LastOrDefault
LastOrDefault方法将返回序列中的最后一个元素;如果序列中不包含任何元素,则返回默认值。使用方法参照FirstOrDefault。
5. ElementAt
ElementAt方法返回序列中指定索引处的元素。使用方法参照First。需要注意的是如果索引超出范围会导致异常。
6. ElementAtOrDefault
ElementAtOrDefault方法将返回序列中指定索引处的元素;如果索引超出范围,则返回默认值。使用方法参照FirstOrDefault。
7. Single
Single方法的无参形式将从一个序列中返回单个元素,如果该序列包含多个元素,或者没有元素数为0,则会引发异常。也就是说,在序列执行Single方法的无参形式时,必须保证该序列有且仅有一个元素。
Single方法的有参形式将从一个序列中返回符合指定条件的唯一元素,如果有多个元素,或者没有元素符合这一条件,则会引发异常。以下代码演示了Single的使用方式:

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjjxpz.html