2014-12-14 7 views
-1

у меня есть:Как узнать, содержит ли список, разделенный запятой, значение?

var a1 = "1,2,12,13"; 
var a2 = "2,12,13"; 

var b1 = a1.Contains(1); // Should give true 
var b2 = a2.Contains(1); // Should give false 

Как я могу узнать, если натянуть содержит значение 1, а не только какой-либо один?

+1

Что вы ищете? п? ', а не только 1? – Sajeetharan

+2

@ Sajeetharan довольно плохая формулировка и грамматика, но я думаю, что OP хочет проверить, является ли какое-либо из значений ** с запятыми ** номером 1, а не проверяет, является ли какой-либо из ** символов ** символом ''1 «'. –

+0

@OP: это тривиально. Разделите строку на запятую и примените 'Contains' к результирующему массиву. –

ответ

5

вы можете использовать этот способ расширения. Имейте в виду, что если что-то не так с вашей входной строкой, тогда это вызовет исключение, вы можете добавить к нему обработку исключений, если хотите. (Например, с помощью int.TryParse или поддержки различного разделителя вместо запятой)

public static class StringExtension 
{ 
    public static bool ContainsInt(this string str, int value) 
    { 
     return str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
      .Select(x => int.Parse(x.Trim())) 
      .Contains(value); 
    } 
} 

это будет разделить вашу строку на ,, так что вы будете иметь все ваши номера, но в строковом представлении. Затем вы пытаетесь преобразовать их в целые значения. после этого вы убедитесь, что если эти значения содержат требуемое целочисленное значение. использовать его как этот

var a1 = "1,2,12,13"; 
var a2 = "2,12,13"; 

var b1 = a1.ContainsInt(1); // gives true 
var b2 = a2.ContainsInt(1); // gives false 

Если вы хотите использовать его без метода расширения вы можете сделать это

var a1 = "1,2,12,13"; 
var a2 = "2,12,13"; 

var b1 = a1.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
      .Select(x => int.Parse(x.Trim())) 
      .Contains(1); // gives true 

var b2 = a2.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
      .Select(x => int.Parse(x.Trim())) 
      .Contains(1); // gives false 
+0

@doctor - можете ли вы привести пример того, как это сделать без метода расширения? Спасибо –

+0

@doctor - Я получаю сообщение об ошибке System.Array не содержит определения для select –

+2

add 'using System.Linq;' – dotctor

-1
private bool IsFound(string input) 
    { 

     string[] a1_values = input.Split(','); 


     foreach (string item in a1_values) 
     { 
      if (item == "1") 
      { 

       return true; 
      } 
      else 
      { 

       return false; 

     } 

    } 
+0

Это будет проверять только первый элемент, а переменная isFound является беспредметной. – Svish

+0

Да ... вы правы, переменная isFound бессмысленна. Я удалил его. да, это проверяет все введенные вами данные, поэтому, если у вас есть больше, то снова запустите метод – SuncoastOwner

+0

Он по-прежнему будет проверять только первое значение в a1_values ​​(независимо от того, что есть a1). Вам нужно переместить 'return false;' вне цикла, чтобы он проверял все элементы. В противном случае он просто проверит первый и вернет false. – Svish

0

Если вы уверены, что ваша строка не содержит пробелов вас могут использовать это:

public static class StringExtension 
{ 
    public static bool ContainsValue(this string str, object value) 
    {  
     return str.StartsWith(value.ToString()+",") || str.EndsWith(","+value) || str.Contains(","+value+","); 
    } 
} 
+0

Или вы можете просто 'str.Replace (" "," ")' заранее. –

+0

Да, или это. Хороший улов. – bamanow

+0

Я использовал этот фрагмент в одном из моих старых, но в настоящее время используемых проектов. База данных SqlServer 2005 имеет таблицу, в которой один столбец имеет значения, разделенные запятой. И я убедился, что перед сохранением данных в столбце не было пробелов. Поэтому нет необходимости в удалении пробелов. – bamanow

Смежные вопросы