2012-05-30 3 views
0

Я пытаюсь написать простую программу, которая будет принимать 2 многострочных входа из 2 текстовых полей, поместить их в 2 массива и сравнить их.Сравнение 2 массивов строк C#

Я хочу проверить, является ли запись в массиве 1 (каждая строка текстового поля 1 является отдельной записью в массиве 1) находится в массиве 2 (каждая строка текстового поля 2 является отдельной записью в массиве 2).

затем выводят результаты в текстовое поле.

, например:

массив 1 "один, два, три, четыре, шесть"

Массив 2 "один, три, пять, четыре"

он должен вывести:

one = found 
two = not found 
three = found 
four = found 
six = not found 

код я до сих пор выглядит следующим образом:

private void button1_Click(object sender, EventArgs e) 
    { 
     textBox3.Text = ""; 
     string[] New = textBox1.Text.Split('\n'); 
     string[] Existing = textBox2.Text.Split('\n'); 


     //for each line in textbox1's array 
     foreach (string str in New) 
     { 

      //if the string is present in textbox2's array 
      if (Existing.Contains(str)) 
      { 
       textBox3.Text = " ##" + textBox3.Text + str + "found"; 
      } 
      /if the string is not present in textbox2's array 
      else 

      { 
       textBox3.Text = " ##" +textBox3.Text + str + "not found"; 
      } 
     } 


    } 

Это не работает правильно, если есть более чем одна строка в любом текстовом поле - я не могу понять, почему .. происходит в тестовых прогонов следующее:

Array 1 - "One" 
Array 2 - "One" 
Result = One Found 


Array 1 - "One" 
Array 2 - "One, Two" 
Result = One Not Found 


Array 1 - "One, Two" 
Array 2 - "One, Two" 
Result = One found, Two Found 

Array 1 - "One, Two, Three" 
Array 2 - "One, Two" 
Result - One Found, Two Not Found, Three Not Found 

Заранее спасибо

+2

W Ты хочешь сказать, что «неправильно работает»? –

+0

Что именно не работает? –

+1

Вы пробовали отлаживать его и видеть, что такое содержимое 'textBox1.Text' и' textBox2.Text'? –

ответ

5

Это не работает правильно, если в текстовом поле имеется более одной строки - может ли кто-нибудь понять, почему?

Вы должны поработать над диагностикой самих проблем - я подозреваю, что простая точка останова перед циклом, после изучения массивов, немедленно обнаружит проблему.

Я уверен, что проблема в том только, что вы должны быть разделив на "\r\n" вместо '\n' - в настоящее время вы будете в конечном итоге с мошенника \r в конце всех, кроме последней строки, которая испортит результаты.

Вместо того чтобы использовать Text свойство, а затем разделив его, вы могли бы просто использовать Lines собственность вместо:

string[] newLines = textBox1.Lines; 
string[] existingLines = textBox2.Lines; 
... 

EDIT: Как было отмечено в ответ Guffa, вы будете также хотите, чтобы избежать замены textBox3.Text на каждая итерация.Лично я бы, вероятно, использовать создать List<string>, добавить к нему на каждой итерации, то в конце использования:

textBox3.Lines = results.ToArray(); 
+0

Точно. Элемент управления TextBox имеет свойство Lines, которое даст вам именно то, что вы хотите: массив отдельных строк. –

+0

@ w.brian: Действительно, я просто редактировал, чтобы показать этот подход :) –

+0

'Environment.NewLine' также может использоваться для раскалывания –

1

использования сила, Лук:

char[] delimiterChars = { ' ', ',', '.', ':', '\t', '\n', '\r' }; 
string[] words = text.Split(delimiterChars); 

Добавлено '\ r' для разделителей.

+0

На самом деле я не думаю, что это поможет, как написано, - оно все равно останется '\ r' в конце всех строк, но последнее ... и я ничего не вижу в вопросе, предполагающем, что OP хочет разбить каждую строку на слова. –

+0

Хорошо, это был общий ответ. Ваш более конкретный, но оставит запятые и другие символы. – Forgottn

1

Вы можете попробовать этот код (просто изменить int к string в):

var a = Enumerable.Range(1, 10); 
var b = new[] { 7, 8, 11, 12 }; 

// mixing the two arrays, since it's a ISet, this will contain unique values 
var c = new HashSet<int>(a); 
b.ToList().ForEach(x => c.Add(x)); 

// just project the results, you can iterate through this collection to 
// present the results to the user 
var d = c.Select(x => new { Number = x, FoundInA = a.Contains(x), FoundInB = b.Contains(x) }); 

Который производит:

enter image description here

1
string[] New = textBox1.Text.Split(',').Select(t => t.Trim()).ToArray(); 
string[] Existing = textBox2.Text.Split(',').Select(t => t.Trim()).ToArray(); 
StringBuilder sb = new StringBuilder(); 
foreach (var str in New) 
{ 
    sb.AppendLine(str + (Existing.Contains(str) ? " found" : " not found")); 
} 
textBox3.Text = sb.ToString(); 
Смежные вопросы