Как насчет этого:
var commonNames = File.ReadLines(path).Intersect(File.ReadLines(path2));
Это O (N + M) вместо вашего текущего решения, которое проверяет каждую строку в первом файле с каждую строку во втором файле - O (N * M).
Предполагается, что вы используете .NET 4. В противном случае вы можете использовать File.ReadAllLines
, но это приведет к считыванию всего файла в память. Или вы можете написать эквивалент File.ReadLines
самостоятельно - это не очень сложно.
В конечном счете вы, вероятно, будете ограничены файловым вводом-выводом к тому времени, как вы избавитесь от проблемы O (N * M) в своем текущем коде - не так много способов обойти это.
РЕДАКТИРОВАТЬ: Для .NET 2, сначала давайте реализуем что-то вроде ReadLines
:
public static IEnumerable<string> ReadLines(string file)
{
using (TextReader reader = File.OpenText(file))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
Теперь мы действительно хотим использовать HashSet<T>
, но этого не было в .NET 2 - поэтому давайте вместо этого используем Dictionary<TKey, TValue>
:
Dictionary<string, string> map = new Dictionary<string, string>();
foreach (string line in ReadLines(path))
{
map[line] = line;
}
List<string> intersection = new List<string>();
foreach (string line in ReadLines(path2))
{
if (map.ContainsKey(line))
{
intersection.Add(line);
}
}