在LINQ列表中查找项目?

在这里我有一个简单的例子来查找string列表中的项目。 通常我使用循环或匿名委托做到这一点:

int GetItemIndex(string search) { int found = -1; if ( _list != null ) { foreach (string item in _list) // _list is an instance of List<string> { found++; if ( string.Equals(search, item) ) { break; } } /* use anonymous delegate string foundItem = _list.Find( delegate(string item) { found++; return string.Equals(search, item); }); */ } return found; } 

LINQ对我来说是新的。 我很好奇,如果我可以使用LINQfind列表中的项目? 如果可能的话?

有几种方法(注意这不是一个完整的列表)。

1) 将返回一个单一的结果,但如果它发现没有或超过一个(这可能会或可能不是你想要的)会抛出一个exception:

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

注意SingleOrDefault()将performance相同,只不过它将为引用types返回null,或者为值types返回默认值,而不是抛出exception。

2) 在哪里将返回符合您的条件的所有项目,所以你可能会得到一个IEnumerable与一个元素:

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

3) 首先将返回符合您的标准的第一个项目:

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

注意FirstOrDefault()将performance相同,除了它将返回null作为引用types,或者值types的默认值,而不是抛出exception。

如果你想要的元素的索引,这将做到这一点:

 int index = list.Select((item, i) => new { Item = item, Index = i }) .First(x => x.Item == search).Index; // or 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(); 

第一遍你不能摆脱lambda。

请注意,如果该项目不存在,则会抛出。 这可以通过求空值来解决问题:

 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(); 

如果你想要的项目:

 // Throws if not found var item = list.First(item => item == search); // or var item = (from item in list where item == search select item).First(); // Null if not found var item = list.FirstOrDefault(item => item == search); // or var item = (from item in list where item == search select item).FirstOrDefault(); 

如果要计算匹配项目的数量:

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

如果你想要所有匹配的项目:

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

在这些情况下,不要忘记检查清单。

或者使用(list ?? Enumerable.Empty<string>())而不是list

感谢Pavel在评论中提供的帮助。

如果它真的是一个List<string>你不需要LINQ,只需使用:

 int GetItemIndex(string search) { return _list == null ? -1 : _list.IndexOf(search); } 

如果你正在寻找物品本身,请尝试:

 string GetItem(string search) { return _list == null ? null : _list.FirstOrDefault(s => s.Equals(search)); } 

你想要在列表中的项目或实际项目本身(将承担项目本身)。

这里有一些选项给你:

 string result = _list.First(s => s == search); string result = (from s in _list where s == search select s).Single(); string result = _list.Find(search); int result = _list.IndexOf(search); 

这种方法更简单,更安全

 var lOrders = new List<string>(); 

bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false

如何IndexOf

search指定的对象并返回列表中第一个匹配项的索引

例如

 > var boys = new List<string>{"Harry", "Ron", "Neville"}; > boys.IndexOf("Neville") 2 > boys[2] == "Neville" True 

请注意,如果值不在列表中,则返回-1

 > boys.IndexOf("Hermione") -1 

我曾经使用一个字典,这是一种索引列表,它会给我什么我想要的时候我想要的。

 Dictionary<string, int> margins = new Dictionary<string, int>(); margins.Add("left", 10); margins.Add("right", 10); margins.Add("top", 20); margins.Add("bottom", 30); 

无论何时我想访问我的边际值,例如,我的地址我的字典:

 int xStartPos = margins["left"]; int xLimitPos = margins["right"]; int yStartPos = margins["top"]; int yLimitPos = margins["bottom"]; 

所以,根据你在做什么,字典可以是有用的。

这里有一种方法来重写你的方法来使用LINQ:

  public static int GetItemIndex(string search) { List<string> _list = new List<string>() { "one", "two", "three" }; var result = _list.Select((Value, Index) => new { Value, Index }) .SingleOrDefault(l => l.Value == search); return result == null ? -1 : result.Index; } 

因此,用它来调用它

GetItemIndex("two")将返回1,

GetItemIndex("notthere")将返回-1。

参考: linqsamples.com

试试这个代码:

 return context.EntitytableName.AsEnumerable().Find(p => p.LoginID.Equals(loginID) && p.Password.Equals(password)).Select(p => new ModelTableName{ FirstName = p.FirstName, UserID = p.UserID }); 

这将帮助您获取Linq列表search中的第一个或默认值

var results = _List.Where(item => item == search).FirstOrDefault();

此search将find它将返回的第一个或默认值。

如果我们需要从列表中find一个元素,那么我们可以使用FindFindAll扩展方法,但是它们之间存在细微的差别。 这是一个例子。

  List<int> items = new List<int>() { 10, 9, 8, 4, 8, 7, 8 }; // It will return only one 8 as Find returns only the first occurrence of matched elements. var result = items.Find(ls => ls == 8); // this will returns three {8,8,8} as FindAll returns all the matched elements. var result1 = items.FindAll(ls => ls == 8);