Проверьте, содержит ли строка CSV заданное значение C#

#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