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]);
c# unity3d
add a comment |
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]);
c# unity3d
"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
add a comment |
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]);
c# unity3d
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
c# unity3d
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
add a comment |
"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
add a comment |
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.
add a comment |
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];
add a comment |
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.
add a comment |
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);
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
edited Nov 10 at 15:24
answered Nov 10 at 15:18
InBetween
24.2k33965
24.2k33965
add a comment |
add a comment |
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];
add a comment |
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];
add a comment |
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];
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];
answered Nov 11 at 6:16
Yuval Ktz
11
11
add a comment |
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
edited Nov 11 at 13:54
answered Nov 10 at 14:20
Michał Turczyn
12.9k132039
12.9k132039
add a comment |
add a comment |
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);
add a comment |
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);
add a comment |
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);
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);
edited Nov 11 at 19:54
answered Nov 10 at 14:31
derHugo
3,3952925
3,3952925
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
"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