Добавлять в список только в случае совпадения - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть файл, который я импортирую в RTB:

// Some Title
// Some Author
// Created on
// Created by
//

Format:
 "Text Length" : 500 lines
 "Page Length" : 20 pages

Component: 123456
 "Name" : Little Red Riding Hood
 "Body Length" : 13515 lines
 ........etc // can have any number of lines under 'Component: 123456'

Component: abcd
 "Name" : Some other Text
 "Body Length" : 12 lines
 ........etc // can have any number of lines under 'Component: abcd'


... etc, etc  // This can occur thousands of times as this file has an unset length.

Теперь происходит сохранение значений от Component: 123456 до следующего Component (что составляет abcd) в позицию List<string> 0. Следующий будет в позиции 1 ... и так далее, пока весь файл не будет прочитан.

Используя приведенный ниже код, я могу решить вышеуказанную проблему:

string[] splitDataBaseLines = dataBase2FileRTB.Text.Split('\n');
StringBuilder builder = null;
var components = new List<string>();
foreach (var line in splitDataBaseLines)
{
    if (line.StartsWith("Component : "))
    {
        if (builder != null)
        {
            components.Add(builder.ToString());
            builder = new StringBuilder();
        }
        builder = new StringBuilder();
    }
    if (builder != null)
    {
        builder.Append(line);
        builder.Append("\r\n");
    }
}
if (builder != null)
    components.Add(builder.ToString());

Однако теперь, когда это работает правильно, мне нужно манипулировать этим кодом, чтобы добавить его только в componentsСписок , если есть совпадение из другого списка.

Чтобы выяснить, соответствует ли строка, чтобы я мог добавить ее в список components, мне нужно разбить начальную строку выше.Я делаю это, добавляя этот код:

string partNumberMatch;

if (line.StartsWith("Component : "))
{
    partNumberMatch = line.Split(':');
    if (builder != null)
    {
    //....
}

Теперь, когда у меня есть номер компонента / строка, мне нужно сравнить это с другим списком ... Я думал о том, чтобы сделать что-то вроде:

foreach (var item in theOtherList) 
{
    if (item.PartNumber.ToUpper().Equals(partNumberMatch[1]))
}

Но я не думаю, что это лучший способ, или этот способ действительно работает должным образом.

Поэтому мой вопрос, может ли кто-нибудь помочь мне сравнить эти две строки, чтобы увидеть, совпадают ли они и толькодобавьте значения компонентов в список component, если элемент соответствует.

Особая благодарность Джону Скиту

1 Ответ

0 голосов
/ 21 сентября 2011

Вот что я придумал, чтобы заставить его работать:

StreamWriter sw2 = new StreamWriter(saveFile2.FileName);
Boolean partMatch = false;
Boolean isAMatch = false;
List<string> newLines = new List<string>();
string[] splitDataBaseLines = dataBase2FileRTB.Text.Split('\n');

foreach (var item in theOtherList)
{
    foreach (var line in splitDataBaseLines)
    {
        if (line.StartsWith("Component : "))
        {
            partNumberMatch = line.Split(':');
            partNumberMatch[1] = partNumberMatch[1].Remove(0,2);
            partNumberMatch[1] = partNumberMatch[1].TrimEnd('"');

            if (partNumberMatch[1].Equals(item.PartNumber))
            {
                isAMatch = true;
                sw2.WriteLine();
            }

            partMatch = true;
        }

        if (line.Equals(""))
        {
            partMatch = false;
            isAMatch = false;
        }

        if (partMatch == true && isAMatch == true)
            sw2.WriteLine(line);
    }
}
sw2.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...