2016-04-22 2 views
2

У меня есть два файлаC# сравнения двух строк массивов

"Database.txt" содержит следующие имена:

  1. Собака
  2. Cat
  3. Mouse
  4. Panda
  5. Bear

"slave.txt" содержит следующие имена:

Cat
Panda

Я хочу, чтобы сравнить "slave.txt" с "Database.txt" и создать третий файл с:

 
2. Cat 
4. Panda 

(Котик и Panda от slave.txt найти в Database.txt)

Мой код:

static void Main(string[] args) 
    { 
     String directory = @"C:\Users\user\Desktop\"; 
     String[] linesA = File.ReadAllLines(Path.Combine(directory, "Database.txt")); 
     String[] linesB = File.ReadAllLines(Path.Combine(directory, "Slave.txt")); 
     IEnumerable<String> onlyB = linesB.Intersect(linesA); 
     File.WriteAllLines(Path.Combine(directory, "Result.txt"), onlyB); 
    } 

работает только на Database.txt структуры, как:

Собака
Cat
Mouse
Panda
Медведь

без номеров строк. Есть ли что-то вместо .Intersect, чтобы найти только часть строки, а не полную строку?

+2

Вы хотите совместить также и "12. Blue Panda" с "Panda"? –

+0

Просто напишите цикл. Или, если вы действительно хотите использовать linq, '.Where (predicate func)' – ryanyuyu

+0

В качестве второго параметра функция .intersect позволяет вам вставлять клиентский выравниватель, по которому вы можете решить, как сравнивать ваши объекты.Используя этот сопоставитель равенства, вы можете сделать equasion на string.contains (otherString), например. Или еще проще: используйте предложение Jasonw – Trickzter

ответ

3

Очень простой подход - Any от Linq. Это только проверка того, содержится ли какая-либо часть строки в B в любой строке A независимо от случая.

var onlyB = linesA.Where(a => linesB.Any(b => a.ToLower().Contains(b.ToLower()))); 

Примечание: Обновление для шоу линий от А вместо линий от B.

+0

Это все еще показывает мне в Result.txt: «Cat Panda» не «2. Cat 4. Panda» – Tommy

+0

Извините, должно быть, неверно сформулировал ваш вопрос. Я думал, что вы хотите линии B вместо линий A, но неважно. Только что обновленный ответ на него. –

+0

Он работает как шарм. Большое спасибо. – Tommy

1

вы можете использовать Linq, как это:

static void Main(string[] args) 
    { 
     String directory = @"C:\Users\user\Desktop\"; 
     String[] linesA = File.ReadAllLines(Path.Combine(directory, "Database.txt")); 
     String[] linesB = File.ReadAllLines(Path.Combine(directory, "Slave.txt")); 
     IEnumerable<String> onlyB = linesA.Where(x=>linesB.Contains(x.Substring(x.IndexOf(". "+1)))); 
     File.WriteAllLines(Path.Combine(directory, "Result.txt"), onlyB); 
    } 
+0

Это не работает, пустой Result.txt – Tommy

+0

Попробуйте еще раз я изменил Somethings – Damirchi

+0

Первый шанс исключением «System.ArgumentOutOfRangeException» типа произошло в mscorlib.dll Необработанное исключение типа «System.ArgumentOutOfRangeException» произошло в mscorlib.dll. Дополнительная информация: StartIndex не может быть ниже нуля. – Tommy

0

Вот метод тест, который я написал и испытания:

private string[] Matcher() 
{ 
    string[] file1 = { "1. Dog","2. Cat","3. Mouse","4. Panda","5. Bear" }; 
    string[] file2 = { "Cat", "Panda" }; 
    string[] file3 = file1.Where(d => { 
     foreach(string matcher in file2) 
     { 
      if(Regex.Match(d, @"^\d+\.\s+"+matcher + "$").Length > 0) 
      { 
       return true; 
      } 
     } 
     return false; 
    }).ToArray<string>();    

    return file3; 
} 

Предположим, у вас есть номера строк или позиций перед записями в файле1. Это будет пытаться соответствовать: комбинация чисел, точка и требуемые значения с регулярным выражением, а когда она соответствует элементу в списке, это займет этот элемент в массиве file3.

И сбросит Saber Cat когда вы ищете только для Cat.

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