#c# #asp.net #linq #csv
#c# #asp.net #linq #csv
Вопрос:
Я читаю список числовых идентификаторов, разделенных запятыми, который хранится в виде строки. Мне нужно проверить, существует ли идентификатор уже в этом списке. Например:
«1,2,3»
Если я проверю «2», я должен его найти, но если я проверю «22», я не должен.
Какой самый простой и лаконичный способ сделать это?
Мой текущий код выглядит следующим образом:
HttpCookie cookie = Request.Cookies.Get("wishlist");
if (cookie != null)
{
var JSONstring = cookie.Value; //Cookie stored as JSON
Dictionary<string, List<dynamic>> jObj = JsonConvert.DeserializeObject<Dictionary<string, List<dynamic>>>(JSONstring);
// Retreive only the nodeId of each item and store it in a CSV list
string umbracoCSV = String.Join(",", jObj.SelectMany(x => x.Value).Select(x => x.nodeId));
// Convert the CSV into an IEnumerable list of ints
IEnumerable<int> umbracoNodeIdList = umbracoCSV.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse);
foreach(int umbracoNodeId in umbracoNodeIdList){
if(umbracoNodeId == 2){
// Do code if it matches
}else{
// Do code if it doesn't match
}
}
}
Как вы можете видеть, этот код включает в себя довольно ненужный цикл, и на самом деле я хочу иметь возможность анализировать строку CSV непосредственно для значения, а не выполнять вложенный цикл (поскольку этот цикл будет вложен в другой, если это невозможно).
Любая помощь была бы высоко оценена.
Ответ №1:
Вы можете упростить свой код, используя Any
метод:
bool isExists = umbracoCSV.Split(',').Any(x => x == "2");
if(isExists) { }
Комментарии:
1. Спасибо. Это быстрое и простое решение.
Ответ №2:
Здесь у вас есть несколько вариантов:
-
найдите
2
в строкеif(umbracoCSV.Contains(",2,") //,2, is to rule out 22 //Do something
-
используйте регулярное выражение вместо
String.Contains
-
разделите строку и используйте
Any
для нееvar toArray = umbracoCSV.Split(','); if(toArray.Any(x => x == "2") //Do something
-
если вы все еще делаете это
IEnumerable<int>
, вы также можете использоватьAny
if(umbracoNodeIdList.Any(x => x == 2) //Do something