
LINQ之Single,SingleOrDefault
发布日期:2021-05-07 00:14:34
浏览次数:10
分类:技术文章
本文共 6179 字,大约阅读时间需要 20 分钟。
目录
Single()
Single()
的用法是获取唯一的元素。
public static TSource Single<TSource>( this IEnumerable<TSource> source );
听起来可能有点抽象,请继续往下看。 代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 5 }; int result = numbers.Single(); System.Console.WriteLine( "数据:{0}", numbers.Text() ); System.Console.WriteLine( "结果:{0}", result ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} 数据:[5],结果:5
通过single()
我们获取了数组中唯一的5元素。
示例代码:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 1, 2, 3, 5, 7, 11 }; // 大于10的值 int result = numbers.Single( value => value > 10 ); System.Console.WriteLine( "数据:{0}", numbers.Text() ); System.Console.WriteLine( "结果:{0}", result ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} 数据:[1], [2], [3], [5], [7], [11],结果:11
Single()可以处理任何类型。
因此,无论是float
,还是string
,它都能处理任何事情。 以下是使用class
的数组的示例。 示例代码:
public static class Program{ private class Parameter { public int ID { get; set; } public string Name { get; set; } public override string ToString() { return string.Format( "ID:{0}, Name:{1}", ID, Name ); } } static void Main( string[] args ) { Parameter[] parameters = new Parameter[] { new Parameter() { ID = 5, Name = "正一郎" }, new Parameter() { ID = 13, Name = "清次郎" }, new Parameter() { ID = 25, Name = "誠三郎" }, new Parameter() { ID = 42, Name = "征史郎" }, }; // ID小于10 Parameter result = parameters.Single( value => value.ID < 10 ); System.Console.WriteLine( "数据:{0}", parameters.Text() ); System.Console.WriteLine( "结果:{0}", result ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} 数据:[ID:5, Name:正一郎], [ID:13, Name:清次郎], [ID:25, Name:誠三郎], [ID:42, Name:征史郎],结果:ID:5, Name:正一郎
但是,在以下情况使用Single()
会报错。
System.InvalidOperationException:序列包含多个元素
2.序列包含多个匹配元素。(有指定条件的情况)System.InvalidOperationException:序列包含多个匹配元素
3.序列为空。System.InvalidOperationException:序列不包含任何元素
4.没有元素满足条件。System.InvalidOperationException:序列不包含匹配的元素
SingleOrDefault()
SingleOrDefault()
和Single()
用法相同,但是在未返回任何元素的情况下会返回该类型的默认值。
public static TSource SingleOrDefault<TSource>( this IEnumerable<TSource> source );
public static TSource SingleOrDefault<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate );
代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { }; int result = 0; try { result = numbers.SingleOrDefault(); } catch( System.Exception i_exception ) { System.Console.WriteLine( "异常:{0}", i_exception ); System.Console.ReadKey(); return; } System.Console.WriteLine( "数据:{0}", numbers.Text() ); System.Console.WriteLine( "结果:{0}", result ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }}数据:结果:0
那么我们加上条件呢?
代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 1, 2, 3, 5, 7, 11 }; int result = 0; try { // 大于20 result = numbers.SingleOrDefault( value => value > 20 ); } catch( System.Exception i_exception ) { System.Console.WriteLine( "异常:{0}", i_exception ); System.Console.ReadKey(); return; } System.Console.WriteLine( "数据:{0}", numbers.Text() ); System.Console.WriteLine( "结果:{0}", result ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} 数据:[1], [2], [3], [5], [7], [11],结果:0
但是,使用SingleOrDefault()
要小心,因为可能会无法区分“找不到元素,则返回默认值0”还是“找到元素0,所以我返回了它。”
还要注意一点的是,如果获取到多个元素,则会引发异常!
代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 1, 2, 3, 5, 7, 11 }; int result = 0; try { // 获取奇数 result = numbers.SingleOrDefault( value => value % 2 == 1 ); } catch( System.Exception i_exception ) { System.Console.WriteLine( "异常:{0}", i_exception ); System.Console.ReadKey(); return; } System.Console.WriteLine( "数据:{0}", numbers.Text() ); System.Console.WriteLine( "结果:{0}", result ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} 异常:System.InvalidOperation Exception:序列中包含多个匹配的元素已完成
所以,Single()
和SingleOrDefault()
是用来获取唯一元素的!
发表评论
最新留言
很好
[***.229.124.182]2025年03月20日 08时18分30秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
自然划分的3-4-5规则
2019-03-03
剑指offer Leetcode 37.序列化二叉树
2019-03-03
剑指offer Leetcode 39.数组中出现次数超过一半的数字
2019-03-03
Latex中cases环境引入报错
2019-03-03
Latex排版的时候把图片放在指定位置
2019-03-03
用 Python 把你的朋友变成表情包(鼠标事件提取 ROI 版)
2019-03-03
Tensorflow2.0:基于循环卷积网络预测剩余寿命
2019-03-03
bzoj3879: SvT 后缀自动机
2019-03-03
4084: [Sdoi2015]双旋转字符串
2019-03-03
bzoj3439: Kpm的MC密码(四种做法)
2019-03-03
Nginx出现500 Internal Server Error 错误
2019-03-03
pytorch loss = loss_func(output, label) 报错
2019-03-03
51nod 1526 分配笔名
2019-03-03
MySQL中drop、truncate和delete的区别?
2019-03-03
Mysql索引底层B+树的实现原理以及Innodb和Myisam引擎存储的区别
2019-03-03
09-01 Java语言基础(package、import)
2019-03-03
11-01 Java语言基础(Scanner类)
2019-03-03
12-04 Java语言基础(Arrays类)
2019-03-03
Accessing Excel Spreadsheets via C++
2019-03-04
excel上传核心
2019-03-04