2010-10-12 1 views
19

.NET 2строка array.Contains?

string[] myStrings = GetMyStrings();  
string test = "testValue"; 

Как я могу проверить, если myStrings содержит test?

+0

vb.net и C# не тот же язык ... –

+0

@ Крис Томпсон: это eddy556 .... – serhio

+1

IQ тест? такой вопрос от парня ~ 4K?! (Использование .NET 2.0 не ясно) – Xaqron

ответ

2
bool ContainsString(string[] arr, string testval) 
{ 
    if (arr == null) 
     return false; 
    for (int i = arr.Length-1; i >= 0; i--) 
     if (arr[i] == testval) 
      return true; 
    return false; 
} 

И у этого будет лучшее исполнение когда-либо. : P

+0

внимательно прочитайте;) – serhio

+0

@serhio. Я сделал. Трижды. Вы просите определить, содержится ли конкретная строка в массиве строк. Так вы это делаете. Если это не то, что вам нужно, исправьте свой вопрос. –

+0

Просто измените массив из теста на myStrings, и этот ответ будет работать. Как это не работает для вас? –

9

Вместо того, чтобы использовать статический массив, вы могли бы использовать список:

List<string> myStrings = new List<string>(GetMyStrings()); 
if(myStrings.Contains("testValue")) 
{ 
    // Do Work 
} 
+0

Я использую 'string [] letters =" a, b, c, d ".Split();'. Оптимально ли для такой элементарной функции использовать преобразования из массива в список? – serhio

+5

@serhio - сначала код, при необходимости оптимизируйте позже. Если вы не создаете эти списки в больших масштабах, действительно не должно быть никаких проблем. –

-2

Я предполагаю, что вы хотите проверить, если какие-либо элементы в массиве содержит определенное значение (тест). Если это так, вы хотите построить простой цикл. На самом деле, я думаю, вы должны click here.

10

Ниже приведен подход, совместимый с .NET 2.0. Использование Array.Find вернет null, если значение не найдено.

C# подход

string[] myStrings = { "A", "B", "testValue" }; 
string test = "testValue"; 
string result = Array.Find(myStrings, delegate(string s) { return s == test; }); 
Console.WriteLine("Result: " + result); 

Если вам нужно использовать регистронезависимы матч s.Equals(test, StringComparison.InvariantCultureIgnoreCase).

EDIT: с VB.NET 2.0 требуется больше усилий, поскольку оно не поддерживает анонимных делегатов. Вместо этого вам нужно будет добавить Function и использовать AddressOf, чтобы указать на него. Вам нужно будет установить testValue как элемент или свойство, так как оно не будет передано методу предиката. В следующем примере я использую Array.Exists.

VB.NET подход

' field or property ' 
Dim test As String = "testValue" 

Sub Main 
    Dim myStrings As String() = { "A", "B", "testValue" }  
    Dim result As Boolean = Array.Exists(myStrings, AddressOf ContainsValue) 
    Console.WriteLine(result) 
End Sub 

' Predicate method ' 
Private Function ContainsValue(s As String) As Boolean 
    Return s = test 
End Function 
+0

спасибо за решение VB, даже если мне нужен C# один, может быть, для людей VB будет полезно ... – serhio

+0

Я пропустил требования 2.0 и VB. Это будет работать, конечно, но вызов Array.IndexOf может быть проще. –

+0

@ Крис согласился. Это ближе к типу проверки «Содержит», но требует больше усилий, чем «IndexOf». –

18

В .NET 2.0, вы можете сделать следующее, если вы хотите индекс:

int index = Array.FindIndex(
    myStrings, 
    delegate(string s) { return s.Equals(test); } 
); 

index будет -1 если myStrings не содержит test ,

Если вы просто хотите, чтобы проверить наличие:

bool exists = Array.Exists(
    myStrings, 
    delegate(string s) { return s.Equals(test); } 
); 
1

Вот почти точно такой же вопрос на MSDN. Find String in String Array Как уже сказали, что вы на самом деле есть два варианта: 1) Используйте список для проще проверки 2) Loop через массив для поиска строки

0

Как об этом:

Sub Main 
    Dim myStrings(4) As String 
    myStrings(0) = "String 1" 
    myStrings(1) = "String 2" 
    myStrings(2) = "testValue" 
    myStrings(3) = "String 3" 
    myStrings(4) = "String 4" 

    Dim test As String = "testValue" 

    Dim isFound As Boolean = Array.IndexOf(myStrings, test) >= 0 

    If isFound Then 
     Console.WriteLine("Found it!") 
    End If 
End Sub 

Это должно работайте на .Net 2.0 и VB.Net.

+1

Проблема OP заключается в том, что она не совместима с .NET 2.0 с lambdas. –

+0

Если OP использует VS2008, то они могут использовать lambdas при настройке .NET 2.0. – onedaywhen

1

вы можете использовать Array.BinarySearch, как описано ниже.

string[] strArray = GetStringArray(); 
     string strToSearch ="test"; 
     Array.BinarySearch(strArray, strToSearch); 
+0

+1. Общий вариант может быть даже лучше. – serhio

+1

Он будет работать только в том случае, если массив отсортирован – Jan

7

Мысль Я хотел бы добавить еще один к соединению, первый доступный в .NET 3.5, я считаю:

Enumerable.Contains(myStrings.ToArray(), test) 
+1

. Это означает, что, используя System.Linq, вы можете написать 'myStrings.Contains (test)', поскольку 'Enumerable.Contains' является методом расширения. (BTW, версия .NET 3.5 использует тот же CLR, что и .NET версии 2.0, поэтому обычно это работает в «.NET 2.0».) –

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