C # IF оператор не исключает строки - PullRequest
0 голосов
/ 22 ноября 2018

Итак, проблема в том, что я хочу читать из файла и исключать определенные строки (я неопытный, поэтому я решил использовать IF, поэтому я хочу исключить строки Name, facultyNumber и т. Д., Но это не исключает их для некоторыхпричина? (Я пытался удалить пробелы из оператора if)

 public void read()
            {
               string[] textes = File.ReadAllLines(@"C:\Users\sashk\Source\Repos\ConsoleApp6\ConsoleApp6\save.txt", Encoding.Default);
                double[] gread = new double[] { 1, 2, 3 };
                List<string> texts = new List<string>();
                int i= 0;
                int z = 0;
                foreach (string text in textes)
                {
                    string[] words = textes[i].Split(' ');
                    for (int j = 0; j < words.Length; j++)
                    {
                        if (!words[j].Equals(" Name: ") || !words[j].Equals(" FacultyNumber: ") || !words[j].Equals(" Grades: ") || !words[j].Equals(" AverageGrade: "))
                        {
                            texts.Add(words[j]);
                        }
                    }
                    //  for (int j = 2; j < texts.Count; j++)
                    //  {
                    //      gread[z] = Convert.ToDouble(texts[j]); 
                    //  }
                    //  addStudent(texts[0], Convert.ToInt32(texts[1]), gread);
                    for (int j = 0; j < 40; j++)
                    {
                        Console.WriteLine(texts[j]);
                    }
                    i++;
                }

Содержимое файла выглядит так:

> Name: asd FacultyNumber: 2 Grades: 1,23  4,56  7,89   AverageGrade: 4,56
 Name: as FacultyNumber: 4 Grades: 1  5  9   AverageGrade: 5
 Name: ad FacultyNumber: 3 Grades: 2  4  7   AverageGrade: 4,33333333333333
 Name: ddd00 FacultyNumber: 1 Grades: 12  15  99   AverageGrade: 42

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы можете использовать Contains следующим образом:

var excluded = new[] { "Name:", "FacultyNumber:", "Grades:", "AverageGrade:" }; 

foreach (string text in textes) 
{
    string[] words = textes[i].Split(' ');
    for (int j = 0; j < words.Length; j++) 
    {
        if (!excluded.Contains(words[j]))
        {
            texts.Add(words[j]);
        }
    }
}

Но я думаю, что вы можете сделать это с помощью LINQ.Код будет намного чище:

string[] textes = File.ReadAllLines(@"C:\Users\sashk\Source\Repos\ConsoleApp6\ConsoleApp6\save.txt", Encoding.Default);

var excluded = new[] { "Name:", "FacultyNumber:", "Grades:", "AverageGrade:" }; 

var texts = textes.SelectMany(x => x.Split(' ').Where(y => !excluded.Contains(y)));

foreach(string word in texts)
{
    Console.WriteLine(word);
}
0 голосов
/ 22 ноября 2018

Я довольно новичок в программировании и не знаю, есть ли какие-либо недостатки в использовании метода string.Replace, но я бы так и сделал.

public void read()
{
    string[] textes = File.ReadAllLines(@"C:\Users\sashk\Source\Repos\ConsoleApp6\ConsoleApp6\save.txt", Encoding.Default);
    List<string> texts = new List<string>();

    for (int i = 0; i < textes.Lenght; i++)
    {
        texts.Add(textes[i].Replace(" Name: ", ""));
        texts.Add(textes[i].Replace(" FacultyNumber: ", ""));
        texts.Add(textes[i].Replace(" Grades: ", ""));
        texts.Add(textes[i].Replace(" AverageGrade: ", ""));
    }
    foreach (string text in texts)
    {
        Debug.WriteLine(text);
    }
}
0 голосов
/ 22 ноября 2018

Вы должны && все условия.Поскольку предпочтение || - слева направо, если самое левое условие будет истинным, другие условия рассматриваться не будут.Следовательно, если слово прошло эту часть условия !words[j].Equals(" Name: "), оно пройдет все условие.Поэтому, если есть слово «лайки» FacultyNumber или Grades прошло первое условие и вы не получите то, что указали.Вы можете изменить свой код, например, следующее:

if (!(words[j].Equals(" Name: ") || 
      words[j].Equals(" FacultyNumber: ") || 
      words[j].Equals(" Grades: ") || 
      words[j].Equals(" AverageGrade: ")))
...