如何通过将变量添加到“已禁止”变量列表中来禁止从列表中删除变量?
我希望能够输入一个字符串。将该字符串与文件夹中的文件名进行比较。如果匹配,则读取文件。如果我再次输入相同的字符串,则不应再次读取该文件。在那里,我希望有一个“禁止”字符串列表,在键入该列表时会对其进行检查,以避免再次读取该文件。
我尝试了几种方法,但没有到达目的地。下面是我最后一次尝试的示例。
什么是最好的方法?
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]);
}
}
}
}
}
}
答案 0 :(得分:0)
我会这样建议:
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);
}
}
这个想法是-在每次读取文件时,将文件添加到列表中,因此您可以在每次尝试读取文件时检查是否已读取(或打开)文件。如果是,则引发异常(或执行其他操作)。否则读取文件。
答案 1 :(得分:0)
您可以使用自己的类来代替它成为字符串列表
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);
答案 2 :(得分:0)
Michael的答案是到达这里,但是可以使用更合适的馆藏来跟踪打开的文件来进行改进;如果要唯一性,请使用集合而不是列表:
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;
}
此外,我会避免抛出vexing exceptions。为用户提供一种友好的方式来了解是否已读取文件,而不必让他们最终不得不使用异常作为流控制机制。
答案 3 :(得分:0)
我不明白,但是如果您想替换另一个列表中的值。
您可以使用列表索引使用删除的值创建一个新列表。
String list1 = {"hi", "hello", "World"};
String list2 = {"bye", "goodbye", "World"};
List1[1] = list2[1];