Запретить переменную из списка со списком «бан» - PullRequest
0 голосов
/ 10 ноября 2018

Как я могу запретить переменную из списка, не удаляя ее из этого списка, добавляя переменную в список «запрещенных» переменных?

Я хочу иметь возможность набирать строку. Эта строка сравнивается с именами файлов в папке. Если есть совпадение, файл читается. Если я снова наберу эту же строку, файл не должен быть прочитан снова. Там я хочу иметь список «запрещенных» строк, которые проверяются при наборе текста, чтобы избежать повторного чтения файла.

Я пробовал несколько способов, но не добирался там. Ниже приведен пример моей последней попытки.

Какой будет лучший способ?

public class test 
{

 string scl= "test3";

 List <string> lsf,lso;

 void Start () 
 {
  lsf=//file names 
   new List<string>();

  lso=//files open 
   new List<string>();

  lsf.Add("test0");
  lsf.Add("test1");
  lsf.Add("test2");
  lsf.Add("test3");
  lsf.Add("test4");

  lso.Add("idhtk49fngo");//random string        
 }

void Update () 
{
 if
 (
  Input.GetKeyDown("a")
 )
 {
  for
  (
   int i=0;
   i<lsf.Count;
   i++
  )
  {
   if(lsf[i]==scl)
   {
    Debug.Log
    (i+" is read");

    for
    (
     int j=0;
     j<lso.Count;
     j++
    )
    {

     //how can i avoid reading
     //lsf[3] here the second time
     //"a" is pressed (by having "test3" 
     //added to a "ban" list (lso) )

     if(scl!=lso[j])
     {

      lso.Add(lsf[i]);

     }
    }
   }
  }
 }
}

Ответы [ 4 ]

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

Я не понял, хотя, если вы хотите заменить значение из другого списка. Вы можете использовать индекс списка, чтобы создать новый список со значениями, которые вы удалили. String list1 = {"hi", "hello", "World"}; String list2 = {"bye", "goodbye", "World"}; List1[1] = list2[1];

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

Вместо списка строк можно использовать собственный класс

public class MyFile
{
    public string Name;
    public bool isOpen;

    public MyFile(string name)
    {
        Name = name;
        isOpen = false;
    }
}

List<MyFile> lsf = new List<MyFile>()
{
    new MyFile("test0"),
    new MyFile("test1"),
    new MyFile("test2"),
    new MyFile("test3"),
    new MyFile("test4")
};

Чем при чтении файла установить isOpen в true

MyFile[someIndex].isOpen = true;

и позже вы можете проверить это

// E.g. skip in a loop
if(MyFile[someIndex]) continue;

Вы можете также использовать Linq, чтобы получить список только непрочитанных файлов:

var unreadFiles = lsf.Select(f => f.Name).Where(file => !file.isOpen);
0 голосов
/ 10 ноября 2018

Ответ Майкла - это путь, но его можно улучшить, используя более подходящую коллекцию, доступную для отслеживания открытых файлов;если вы хотите, чтобы уникальность использовала набор, а не список:

 HashSet<string> openedFiles = new HashSet<string>();

 public static bool TryFirstRead(
     string path,
     out string result)
 {
     if (openedFiles.Add(path))
     {
          result = File.ReadAllText(path);
          return true;
     }

     result = null;
     return false;
 }

Кроме того, я бы не стал выбрасывать неприятные исключения .Предоставьте потребителю удобный способ узнать, был ли файл прочитан или нет, не заставляйте его использовать исключения в качестве механизма управления потоком.

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

Я бы предложил такой способ:

public static List<string> openedFiles = new List<string>();
public static string ReadFileAndAddToOpenedList(string path)
{
    if (openedFiles.Contains(path))
        throw new Exception("File already opened");
        // Instead of throwing exception you could for example just log this or do something else, like:
        // Consolle.WriteLine("File already opened");
    else
    {
        openedFiles.Add(path);
        return File.ReadAllText(path);
    }
}

Идея состоит в том, чтобы при каждом чтении файла добавлять файл в список, чтобы вы могли проверять каждый раз, когда вы пытаетесь прочитать файл, если он уже был прочитан (или открыт). Если это так, выбросить исключение (или сделать что-то еще). Остальное прочитайте файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...