问题描述
比如当前有需求是从一个集合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
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册