Ban a variable from a list with a “ban” list









up vote
0
down vote

favorite












How can I ban a variable from a list without removing it from that list by adding the variable to a list of "banned" variable?



I wish to be able to type in a string. That string is compared to the file names in a folder. If there is a match, the file is read. If I type this same string again, the file should not be read again. There for I want to have a list of "banned" string that is checked whilst typing to avoid the file to be read again.



I have tried a few ways but not getting there. Below is an example of my last attempt.



What would be the best way?



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]);
















share|improve this question























  • "Ban" is the wrong term. "AlreadyChecked" is the right one. At it's score, you need a list (AlreadyChecked) and contains check on any input before you run it through the folder itterator. Note that you might run into issue with excact spelling and normalisation, but with Windows Filename Search that is part of the mechanic anyway.
    – Christopher
    Nov 10 at 14:08







  • 1




    Your question is a borderline case example for a "XY" problem. The X you want to solve is "do not touch the same file/folder twice". The Y you came up with was a "ban list" on the inputs. There might actually be a better solution if you ask for teh X, rather then for help with your choosen Y.
    – Christopher
    Nov 10 at 14:12















up vote
0
down vote

favorite












How can I ban a variable from a list without removing it from that list by adding the variable to a list of "banned" variable?



I wish to be able to type in a string. That string is compared to the file names in a folder. If there is a match, the file is read. If I type this same string again, the file should not be read again. There for I want to have a list of "banned" string that is checked whilst typing to avoid the file to be read again.



I have tried a few ways but not getting there. Below is an example of my last attempt.



What would be the best way?



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]);
















share|improve this question























  • "Ban" is the wrong term. "AlreadyChecked" is the right one. At it's score, you need a list (AlreadyChecked) and contains check on any input before you run it through the folder itterator. Note that you might run into issue with excact spelling and normalisation, but with Windows Filename Search that is part of the mechanic anyway.
    – Christopher
    Nov 10 at 14:08







  • 1




    Your question is a borderline case example for a "XY" problem. The X you want to solve is "do not touch the same file/folder twice". The Y you came up with was a "ban list" on the inputs. There might actually be a better solution if you ask for teh X, rather then for help with your choosen Y.
    – Christopher
    Nov 10 at 14:12













up vote
0
down vote

favorite









up vote
0
down vote

favorite











How can I ban a variable from a list without removing it from that list by adding the variable to a list of "banned" variable?



I wish to be able to type in a string. That string is compared to the file names in a folder. If there is a match, the file is read. If I type this same string again, the file should not be read again. There for I want to have a list of "banned" string that is checked whilst typing to avoid the file to be read again.



I have tried a few ways but not getting there. Below is an example of my last attempt.



What would be the best way?



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]);
















share|improve this question















How can I ban a variable from a list without removing it from that list by adding the variable to a list of "banned" variable?



I wish to be able to type in a string. That string is compared to the file names in a folder. If there is a match, the file is read. If I type this same string again, the file should not be read again. There for I want to have a list of "banned" string that is checked whilst typing to avoid the file to be read again.



I have tried a few ways but not getting there. Below is an example of my last attempt.



What would be the best way?



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]);













c# unity3d






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 10 at 14:21









Michał Turczyn

12.9k132039




12.9k132039










asked Nov 10 at 14:06









cubecube

11




11











  • "Ban" is the wrong term. "AlreadyChecked" is the right one. At it's score, you need a list (AlreadyChecked) and contains check on any input before you run it through the folder itterator. Note that you might run into issue with excact spelling and normalisation, but with Windows Filename Search that is part of the mechanic anyway.
    – Christopher
    Nov 10 at 14:08







  • 1




    Your question is a borderline case example for a "XY" problem. The X you want to solve is "do not touch the same file/folder twice". The Y you came up with was a "ban list" on the inputs. There might actually be a better solution if you ask for teh X, rather then for help with your choosen Y.
    – Christopher
    Nov 10 at 14:12

















  • "Ban" is the wrong term. "AlreadyChecked" is the right one. At it's score, you need a list (AlreadyChecked) and contains check on any input before you run it through the folder itterator. Note that you might run into issue with excact spelling and normalisation, but with Windows Filename Search that is part of the mechanic anyway.
    – Christopher
    Nov 10 at 14:08







  • 1




    Your question is a borderline case example for a "XY" problem. The X you want to solve is "do not touch the same file/folder twice". The Y you came up with was a "ban list" on the inputs. There might actually be a better solution if you ask for teh X, rather then for help with your choosen Y.
    – Christopher
    Nov 10 at 14:12
















"Ban" is the wrong term. "AlreadyChecked" is the right one. At it's score, you need a list (AlreadyChecked) and contains check on any input before you run it through the folder itterator. Note that you might run into issue with excact spelling and normalisation, but with Windows Filename Search that is part of the mechanic anyway.
– Christopher
Nov 10 at 14:08





"Ban" is the wrong term. "AlreadyChecked" is the right one. At it's score, you need a list (AlreadyChecked) and contains check on any input before you run it through the folder itterator. Note that you might run into issue with excact spelling and normalisation, but with Windows Filename Search that is part of the mechanic anyway.
– Christopher
Nov 10 at 14:08





1




1




Your question is a borderline case example for a "XY" problem. The X you want to solve is "do not touch the same file/folder twice". The Y you came up with was a "ban list" on the inputs. There might actually be a better solution if you ask for teh X, rather then for help with your choosen Y.
– Christopher
Nov 10 at 14:12





Your question is a borderline case example for a "XY" problem. The X you want to solve is "do not touch the same file/folder twice". The Y you came up with was a "ban list" on the inputs. There might actually be a better solution if you ask for teh X, rather then for help with your choosen Y.
– Christopher
Nov 10 at 14:12













4 Answers
4






active

oldest

votes

















up vote
0
down vote













Michael’s answer is the way to go here but it can be improved using the more appropriate collection available to keep track of opened files; if you want uniqueness use a set, not a list:



 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;



Also, I’d avoid throwing vexing exceptions. Give the consumer a friendly way to know if the file was read or not, don’t make them end up having to use exceptions as a flow control mechanism.






share|improve this answer





























    up vote
    0
    down vote













    I didn't understand although if you want to replace a value from another list.
    You can use the list index to create a new list with the values which you removed.
    String list1 = "hi", "hello", "World";
    String list2 = "bye", "goodbye", "World";
    List1[1] = list2[1];






    share|improve this answer



























      up vote
      0
      down vote













      I would suggest such way:



      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);




      The idea is - on every file read, add file to list, so you can check every time you try read file, if it was already read (or opened). If it is, throw exception (or do something else). Else read a file.






      share|improve this answer





























        up vote
        0
        down vote













        You could instead of making it a string list use your own class





        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")
        ;


        Than when you read the file set isOpen to true



        MyFile[someIndex].isOpen = true;


        and later you can check this



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


        You could than also use Linq in order to get a list of only unread files:



        var unreadFiles = lsf.Select(f => f.Name).Where(file => !file.isOpen);





        share|improve this answer






















          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













           

          draft saved


          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239755%2fban-a-variable-from-a-list-with-a-ban-list%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          4 Answers
          4






          active

          oldest

          votes








          4 Answers
          4






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          0
          down vote













          Michael’s answer is the way to go here but it can be improved using the more appropriate collection available to keep track of opened files; if you want uniqueness use a set, not a list:



           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;



          Also, I’d avoid throwing vexing exceptions. Give the consumer a friendly way to know if the file was read or not, don’t make them end up having to use exceptions as a flow control mechanism.






          share|improve this answer


























            up vote
            0
            down vote













            Michael’s answer is the way to go here but it can be improved using the more appropriate collection available to keep track of opened files; if you want uniqueness use a set, not a list:



             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;



            Also, I’d avoid throwing vexing exceptions. Give the consumer a friendly way to know if the file was read or not, don’t make them end up having to use exceptions as a flow control mechanism.






            share|improve this answer
























              up vote
              0
              down vote










              up vote
              0
              down vote









              Michael’s answer is the way to go here but it can be improved using the more appropriate collection available to keep track of opened files; if you want uniqueness use a set, not a list:



               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;



              Also, I’d avoid throwing vexing exceptions. Give the consumer a friendly way to know if the file was read or not, don’t make them end up having to use exceptions as a flow control mechanism.






              share|improve this answer














              Michael’s answer is the way to go here but it can be improved using the more appropriate collection available to keep track of opened files; if you want uniqueness use a set, not a list:



               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;



              Also, I’d avoid throwing vexing exceptions. Give the consumer a friendly way to know if the file was read or not, don’t make them end up having to use exceptions as a flow control mechanism.







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Nov 10 at 15:24

























              answered Nov 10 at 15:18









              InBetween

              24.2k33965




              24.2k33965






















                  up vote
                  0
                  down vote













                  I didn't understand although if you want to replace a value from another list.
                  You can use the list index to create a new list with the values which you removed.
                  String list1 = "hi", "hello", "World";
                  String list2 = "bye", "goodbye", "World";
                  List1[1] = list2[1];






                  share|improve this answer
























                    up vote
                    0
                    down vote













                    I didn't understand although if you want to replace a value from another list.
                    You can use the list index to create a new list with the values which you removed.
                    String list1 = "hi", "hello", "World";
                    String list2 = "bye", "goodbye", "World";
                    List1[1] = list2[1];






                    share|improve this answer






















                      up vote
                      0
                      down vote










                      up vote
                      0
                      down vote









                      I didn't understand although if you want to replace a value from another list.
                      You can use the list index to create a new list with the values which you removed.
                      String list1 = "hi", "hello", "World";
                      String list2 = "bye", "goodbye", "World";
                      List1[1] = list2[1];






                      share|improve this answer












                      I didn't understand although if you want to replace a value from another list.
                      You can use the list index to create a new list with the values which you removed.
                      String list1 = "hi", "hello", "World";
                      String list2 = "bye", "goodbye", "World";
                      List1[1] = list2[1];







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Nov 11 at 6:16









                      Yuval Ktz

                      11




                      11




















                          up vote
                          0
                          down vote













                          I would suggest such way:



                          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);




                          The idea is - on every file read, add file to list, so you can check every time you try read file, if it was already read (or opened). If it is, throw exception (or do something else). Else read a file.






                          share|improve this answer


























                            up vote
                            0
                            down vote













                            I would suggest such way:



                            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);




                            The idea is - on every file read, add file to list, so you can check every time you try read file, if it was already read (or opened). If it is, throw exception (or do something else). Else read a file.






                            share|improve this answer
























                              up vote
                              0
                              down vote










                              up vote
                              0
                              down vote









                              I would suggest such way:



                              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);




                              The idea is - on every file read, add file to list, so you can check every time you try read file, if it was already read (or opened). If it is, throw exception (or do something else). Else read a file.






                              share|improve this answer














                              I would suggest such way:



                              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);




                              The idea is - on every file read, add file to list, so you can check every time you try read file, if it was already read (or opened). If it is, throw exception (or do something else). Else read a file.







                              share|improve this answer














                              share|improve this answer



                              share|improve this answer








                              edited Nov 11 at 13:54

























                              answered Nov 10 at 14:20









                              Michał Turczyn

                              12.9k132039




                              12.9k132039




















                                  up vote
                                  0
                                  down vote













                                  You could instead of making it a string list use your own class





                                  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")
                                  ;


                                  Than when you read the file set isOpen to true



                                  MyFile[someIndex].isOpen = true;


                                  and later you can check this



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


                                  You could than also use Linq in order to get a list of only unread files:



                                  var unreadFiles = lsf.Select(f => f.Name).Where(file => !file.isOpen);





                                  share|improve this answer


























                                    up vote
                                    0
                                    down vote













                                    You could instead of making it a string list use your own class





                                    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")
                                    ;


                                    Than when you read the file set isOpen to true



                                    MyFile[someIndex].isOpen = true;


                                    and later you can check this



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


                                    You could than also use Linq in order to get a list of only unread files:



                                    var unreadFiles = lsf.Select(f => f.Name).Where(file => !file.isOpen);





                                    share|improve this answer
























                                      up vote
                                      0
                                      down vote










                                      up vote
                                      0
                                      down vote









                                      You could instead of making it a string list use your own class





                                      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")
                                      ;


                                      Than when you read the file set isOpen to true



                                      MyFile[someIndex].isOpen = true;


                                      and later you can check this



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


                                      You could than also use Linq in order to get a list of only unread files:



                                      var unreadFiles = lsf.Select(f => f.Name).Where(file => !file.isOpen);





                                      share|improve this answer














                                      You could instead of making it a string list use your own class





                                      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")
                                      ;


                                      Than when you read the file set isOpen to true



                                      MyFile[someIndex].isOpen = true;


                                      and later you can check this



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


                                      You could than also use Linq in order to get a list of only unread files:



                                      var unreadFiles = lsf.Select(f => f.Name).Where(file => !file.isOpen);






                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited Nov 11 at 19:54

























                                      answered Nov 10 at 14:31









                                      derHugo

                                      3,3952925




                                      3,3952925



























                                           

                                          draft saved


                                          draft discarded















































                                           


                                          draft saved


                                          draft discarded














                                          StackExchange.ready(
                                          function ()
                                          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239755%2fban-a-variable-from-a-list-with-a-ban-list%23new-answer', 'question_page');

                                          );

                                          Post as a guest















                                          Required, but never shown





















































                                          Required, but never shown














                                          Required, but never shown












                                          Required, but never shown







                                          Required, but never shown

































                                          Required, but never shown














                                          Required, but never shown












                                          Required, but never shown







                                          Required, but never shown







                                          Popular posts from this blog

                                          Top Tejano songwriter Luis Silva dead of heart attack at 64

                                          政党

                                          天津地下鉄3号線