返回LINQ大全首页

Contains()

Contains()可以用来判断序列中是否存在指定的元素。
MSDN
public static bool Contains<TSource>( this IEnumerable<TSource> source, TSource value );
但是要注意此行为会根据元素是值类型还是引用类型而略有变化。

代码示例:

public static class Program
{static void Main( string[] args ){int[]   numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };bool reaultA = numbers.Contains( 8 );bool reaultB = numbers.Contains( 3 );bool reaultC = numbers.Contains( 12 );System.Console.WriteLine( "numbers:{0}", numbers.Text() );System.Console.WriteLine( " 包含8:{0}", reaultA );System.Console.WriteLine( " 包含3:{0}", reaultB );System.Console.WriteLine( "包含12:{0}", reaultC );System.Console.ReadKey();}public static string Text<TSource>( this IEnumerable<TSource> i_source ){string text = string.Empty;foreach( var value in i_source ){text += string.Format( "[{0}], ", value );}return text;}
}numbers:[0], [1], [2], [3], [4], [5], [6], [7], [8], [9],
包含8:True
包含3:True
包含12:False

接下来让我们尝试下引用类型。

代码示例:

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 ){List<Parameter> parameters  = new List<Parameter>();Parameter valueA    = new Parameter() { ID = 0, Name = "正一郎" };Parameter valueB    = new Parameter() { ID = 5, Name = "清次郎" };Parameter valueC    = new Parameter() { ID = 3, Name = "誠三郎" };Parameter valueD    = new Parameter() { ID = 9, Name = "征史郎" };parameters.Add( valueA );parameters.Add( valueB );parameters.Add( valueC );bool reaultA = parameters.Contains( valueA );bool reaultB = parameters.Contains( valueC );bool reaultC = parameters.Contains( valueD );System.Console.WriteLine( "parameters:{0}", parameters.Text() );System.Console.WriteLine( "包含正一郎:{0}", reaultA );System.Console.WriteLine( "包含誠三郎:{0}", reaultB );System.Console.WriteLine( "包含征史郎:{0}", reaultC );System.Console.ReadKey();}public static string Text<TSource>( this IEnumerable<TSource> i_source ){string text = string.Empty;foreach( var value in i_source ){text += string.Format( "[{0}], ", value );}return text;}
}parameters:[ID:0, Name:正一郎], [ID:5, Name:清次郎], [ID:3, Name:誠三郎],
包含正一郎:True
包含誠三郎:True
包含征史郎:False

一切正常。
现在让我们稍微改变一下方法。
下面创建两个内容相同引用不同的类,结果如何呢?

代码示例:

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 ){List<Parameter> parameters  = new List<Parameter>();// 内容相同,引用不同Parameter valueA    = new Parameter() { ID = 0, Name = "征史郎" };Parameter valueB    = new Parameter() { ID = 0, Name = "征史郎" };parameters.Add( valueA );bool reaultA = parameters.Contains( valueA );bool reaultB = parameters.Contains( valueB );System.Console.WriteLine( "parameters:{0}", parameters.Text() );System.Console.WriteLine( "相同引用:{0}", reaultA );System.Console.WriteLine( "不同引用:{0}", reaultB );System.Console.ReadKey();}public static string Text<TSource>( this IEnumerable<TSource> i_source ){string text = string.Empty;foreach( var value in i_source ){text += string.Format( "[{0}], ", value );}return text;}
}parameters:[ID:0, Name:征史郎],
相同引用:True
不同引用:False

虽然valueAvalueB内容相同,但是由于引用不同,所以Contains()将其判断为不同的元素。
那么,即使它是引用类型,如果我要根据内容属性是否相同来检查元素的存在,该怎么办?

Contains()具有重载功能。
您可以独立指定比较方法。用于比较的数据必须继承IEqualityComparer接口。
MSDN
public static bool Contains<TSource>( this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer );
IEqualityComparer
代码示例:

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 );}}// 继承IEqualityComparerprivate class ParameterComparer : IEqualityComparer<Parameter>{// 比较方法public bool Equals( Parameter i_lhs, Parameter i_rhs ){if( i_lhs.ID == i_rhs.ID &&i_lhs.Name == i_rhs.Name ){return true;}return false;}public int GetHashCode( Parameter i_obj ){return i_obj.ID ^ i_obj.Name.GetHashCode();}}static void Main( string[] args ){List<Parameter> parameters  = new List<Parameter>();// 内容相同Parameter valueA    = new Parameter() { ID = 0, Name = "征史郎" };Parameter valueB    = new Parameter() { ID = 0, Name = "征史郎" };parameters.Add( valueA );ParameterComparer comparer  = new ParameterComparer();bool reaultA = parameters.Contains( valueA, comparer );bool reaultB = parameters.Contains( valueB, comparer );System.Console.WriteLine( "parameters:{0}", parameters.Text() );System.Console.WriteLine( "相同引用:{0}", reaultA );System.Console.WriteLine( "不同引用:{0}", reaultB );System.Console.ReadKey();}public static string Text<TSource>( this IEnumerable<TSource> i_source ){string text = string.Empty;foreach( var value in i_source ){text += string.Format( "[{0}], ", value );}return text;}
}
parameters:[ID:0, Name:征史郎],
相同引用:True
不同引用:True

现在两个结果都为true了。

LINQ之Contains相关推荐

  1. ef linq 中判断实体中是否包含某集合

    我有一个需求,问题有很多标签,在查询时,需要筛选包含查询标签的一个集合(List<int>),以前的做法是先查询出来符合查询标签条件的标签id的结果集A,再查询问题时,加上判断是否包含该标 ...

  2. 一.Linq to JSON是用来干什么的?

    Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和 ...

  3. LINQ : IEnumerableT and IQueryableT区别

    本地数据源计算机会自动使用IEnumberable<T>,远程数据源会使用IQueryable<T> 下面这条语句没有使用数据库里的EF数据,显示如下: 下面这条语句使用数据库 ...

  4. New LINQ CTP!

    FYI, we just released an updated community preview of our LINQ support for both VB and C#, entitled ...

  5. 转载LINQ优点 自己学习用的

    这几天在读一本LINQ方面的书<Essential LINQ>,在这里和大家分享下. 由于对LINQ的深入总结需要大量的篇幅,因此在这里分成几个部分来讲. (*我看<Essentia ...

  6. 自己动手重新实现LINQ to Objects: 9 - SelectMany

    本文翻译自Jon Skeet的系列博文"Edulinq". 本篇原文地址: http://msmvps.com/blogs/jon_skeet/archive/2010/12/27 ...

  7. 如何查看Linq to SQL运行时,实际执行的Sql语句

    调试Linq to sql代码是, 如果遇到错误,很难判断错误的原因是什么,如果能够输出实际执行的sql原文,对于我们寻找错误的原因有有很大帮助. 以下是我用到的方法: StringBuilder s ...

  8. LINQ to XML 建立,读取,增,删,改

    LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除.LINQ可以使的生成的XML文档在内存中错落有致.下面以一个小的例子说名LINQ to ...

  9. Linq初级班 Linq To XML体验(基础篇)

    LINQ To XML体验(基础) 这两天开始学习LINQ to XML的知识,我会继续把自己的感想和示例发布给初学者们学习的,一样欢迎高手们多多指点,请勿使用过激语言,针锋相对,我是个初学者,自知还 ...

  10. Linq 无法删除尚未附加的实体的问题

    Linq删除个集合数据, 刚开始用的注释掉的那行, 会提示"无法删除尚未附加的实体"错误, 使用Attach方法依然不行. 想想以前用过DeleteAllOnSubmit没啥问题哈 ...

最新文章

  1. 删除文件中指定的一行
  2. 彻底卸载vscode Linux,ubuntu如何卸载vscode
  3. php 正则 前望,PHP 正则表达式
  4. WebStorm 常用功能的使用技巧分享
  5. 案例精解企业级网络构建
  6. python asyncio_python asyncio(一)
  7. BZOJ 1006 神奇的国度(弦图的染色数)
  8. forEach for 循环
  9. OkHttp3用法全解析
  10. Mercurial:Hg检出的时候:The system cannot find the path specified
  11. linux c语言 取随机数,C语言 获取随机数
  12. nodejs轻量型个人文档管理系统
  13. python解码base64_Python Base64转码解码
  14. IDEA报错:Lombok Requires Annotation Processing, Annotation processing seems to be disabled
  15. 基于梯度下降算法求解线性回归
  16. 使用 LaTeX 制作幻灯片
  17. MapReduce算法(将数据按照 /OutputData/城市名称/日期(YYYY-MM-dd)/类型(固定Gn)/imsi.txt )
  18. 【快捷键】win10 禁用ctrl+space切换中英文快捷键
  19. JavaScript自动触发事件
  20. 【机器学习】树模型遇上类别型特征(Python)

热门文章

  1. 利用一个完全安全的C#文件下载远程木马到内存进行执行
  2. QuantLib 金融计算——收益率曲线之构建曲线(3)
  3. 基于PHP的图书借阅管理系统设计与实现
  4. 用turtle库绘制Python Logo图案
  5. 使用pyppeteer突破淘宝selenium检测实现登陆
  6. Android设计模式详解之观察者模式
  7. java swing(GUI) MySQL实现的视频播放器系统源码+运行教程
  8. 与其埋怨,不如埋了怨
  9. 非常期待的CSDN博客专家勋章收到了,说不出来的兴奋!!同时也祝CSDN越办越好!!!
  10. c语言超市选址问题实验报告,数据结构课程设计-超市选址问题.doc