首页 / .NET / 正文

[LINQ].NET/C#程序开发中使用LINQ从一个集合(List<T>)中查询一个元素有哪些方法?

3015 发布于: 2018-01-29 读完约需7分钟

问题描述

比如当前有需求是从一个集合List<T>中查询一个元素,以前的通用做法是使用for循环去处理,比如如下的伪代码:

int GetItemIndex(string search)
{
   int found = -1;
   if ( _list != null )
   {
     foreach (string item in _list) // List<string>
     {
        found++;
        if ( string.Equals(search, item) )
        {
           break;
        }
      }
      /* 或者使用匿名的委托
      string foundItem = _list.Find( delegate(string item) {
         found++;
         return string.Equals(search, item);
      });
      */
   }
   return found;
}

那么,使用LINQ应该如何来实现类似的查找功能呢?

方案一

使用Single方法,但此方法只有在查询结果为惟一的时候,如果查询结果为0或者多于1个,则都会抛出异常:

string search = "lookforme";
List<string> myList = new List<string>();
string result = myList.Single(s => s == search);

使用Where方法,此方法会返回一个匹配的结果集合:

IEnumerable<string> results = myList.Where(s => s == search);

使用First方法,此方法会返回第一个与查询条件匹配的结果:

string result = myList.First(s => s == search);

方案二

如果只需要获取元素的索引位置,则可以:

int index = list.Select((item, i) => new { Item = item, Index = i })
                .First(x => x.Item == search).Index;

// 或者
var tagged = list.Select((item, i) => new { Item = item, Index = i });
int index = (from pair in tagged
            where pair.Item == search
            select pair.Index).First();

但上面的方式中如果元素不存在,则会抛出异常,所以为了解决这个问题,我们可以写成如下的方式:

var tagged = list.Select((item, i) => new { Item = item, Index = (int?)i });
int? index = (from pair in tagged
            where pair.Item == search
            select pair.Index).FirstOrDefault();

如果需要返回元素本身,则可以使用如下的方式:

// 如果没有查询到元素,则抛出异常
var item = list.First(item => item == search);
// 或者
var item = (from item in list
            where item == search
            select item).First();

// 如果未找到,则返回null
var item = list.FirstOrDefault(item => item == search);
// 或者
var item = (from item in list
            where item == search
            select item).FirstOrDefault();

如果需要获取匹配的元素个数,则可以:

int count = list.Count(item => item == search);
// 或者
int count = (from item in list
            where item == search
            select item).Count();

如果需要获取所有匹配的元素集合,则可以:

var items = list.Where(item => item == search);
// 或者
var items = from item in list
            where item == search
            select item;

方案三

使用Find()方法:

var lOrders = new List<string>();
bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [LINQ].NET/C#程序开发中如何使用LINQ查询前几条数据记录

下一篇: [LINQ].NET/C#程序开中从集合List<T>中获取重复元素的方法有哪些呢?

本文永久链接码友网 » [LINQ].NET/C#程序开发中使用LINQ从一个集合(List<T>)中查询一个元素有哪些方法?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册