List<string> 项在 c# 中消失
List<string> items disappearring in c#
我有一个简单的列表包装器 class:
class ExtensionList
{
public List<string> Extensions;
public ExtensionList()
{
Extensions = new List<string>();
}
public void push(params string[] ext)
{
// Add the * extension if "ALL__" is pushed.
if (ext.Contains("ALL__"))
{
Extensions = new List<string>();
Extensions.Add("*");
return;
}
// Don't add duplicate if pushed extension is already in list.
if (Extensions.Intersect(ext).Any())
return;
Extensions.AddRange(ext);
}
}
和一个实例化“Rec”的循环,每个 Rec 都有上述列表对象之一。
public bool readAppConfig(string appConfigPath)
{
Recs = new Dictionary<string, List<Rec>>()
{
{"Headers", new List<Rec>()},
{"Ignores", new List<Rec>()},
{"Exceptions", new List<Rec>()}
};
foreach (string sectionName in Recs.Keys)
{
var recSection = ConfigurationManager.GetSection(sectionName) as NameValueCollection;
foreach (string key in recSection.AllKeys)
{
Rec r = new Rec();
r.strMatch = key;
r.ExtList.push(recSection[key].Split(';', ' '));
Recs[sectionName].Add(r);
}
}
return true;
}
问题很简单,也很奇怪(至少对我来说)。
当 r.ExtList.push(...) 被调用时,我可以使用 visual studio 跟随执行进入 push() 函数,并看到正确的字符串被添加到 ExtList 中的 'Extensions' (通过将鼠标悬停在它上面)。然后,当我继续使用 visual studio 单步执行代码时,push() 函数 returns 返回到 foreach 循环。从那一刻起,这个 Rec 的 ExtList 不再有任何元素。一旦 push() returns.
它们都消失了
这里是完整的 Rec 结构。
struct Rec
{
public string strMatch;
ExtensionList extList;
public ExtensionList ExtList {
get { return extList??new ExtensionList();}
set { extList = value; }
}
};
您的 getter 为 ExtList
属性 returns 值,或者如果它为空,returns 一个新列表。然后调用对象的 getter 并改变该列表。该列表在任何时候都不会设置为 extList
属性。无论是 属性 getter,还是您初始化 Rec
的代码,都设置该字段。
令人惊讶的是,这实际上与您拥有可变结构这一事实没有任何关系,也就是说,可变结构仍然是邪恶的,您应该像避免瘟疫一样避免它们。您的 struct
应该是不可变的,或者是 class
.
我看不出 ExtensionsList
class 的原因。如前所述,逻辑可以直接实现到 Rec
中。
public struct Rec
{
public Rec(string match) : this()
{
Match=match;
Extensions=new List<string>();
}
public string Match { get; private set; }
public List<string> Extensions { get; private set; }
public void Push(params string[] ext)
{
if(ext.Contains("ALL__"))
{
Extensions=new List<string>() { "*" };
return;
}
if(Extensions.Intersect(ext).Any())
{
return;
}
Extensions.AddRange(ext);
}
}
用法相似:
public bool readAppConfig(string appConfigPath)
{
Recs=new Dictionary<string, List<Rec>>()
{
{"Headers", new List<Rec>()},
{"Ignores", new List<Rec>()},
{"Exceptions", new List<Rec>()}
};
foreach(string sectionName in Recs.Keys)
{
var recSection=ConfigurationManager.GetSection(sectionName) as NameValueCollection;
foreach(string key in recSection.AllKeys)
{
Rec r=new Rec(key);
r.Push(recSection[key].Split(';', ' '));
Recs[sectionName].Add(r);
}
}
return true;
}
我有一个简单的列表包装器 class:
class ExtensionList
{
public List<string> Extensions;
public ExtensionList()
{
Extensions = new List<string>();
}
public void push(params string[] ext)
{
// Add the * extension if "ALL__" is pushed.
if (ext.Contains("ALL__"))
{
Extensions = new List<string>();
Extensions.Add("*");
return;
}
// Don't add duplicate if pushed extension is already in list.
if (Extensions.Intersect(ext).Any())
return;
Extensions.AddRange(ext);
}
}
和一个实例化“Rec”的循环,每个 Rec 都有上述列表对象之一。
public bool readAppConfig(string appConfigPath)
{
Recs = new Dictionary<string, List<Rec>>()
{
{"Headers", new List<Rec>()},
{"Ignores", new List<Rec>()},
{"Exceptions", new List<Rec>()}
};
foreach (string sectionName in Recs.Keys)
{
var recSection = ConfigurationManager.GetSection(sectionName) as NameValueCollection;
foreach (string key in recSection.AllKeys)
{
Rec r = new Rec();
r.strMatch = key;
r.ExtList.push(recSection[key].Split(';', ' '));
Recs[sectionName].Add(r);
}
}
return true;
}
问题很简单,也很奇怪(至少对我来说)。 当 r.ExtList.push(...) 被调用时,我可以使用 visual studio 跟随执行进入 push() 函数,并看到正确的字符串被添加到 ExtList 中的 'Extensions' (通过将鼠标悬停在它上面)。然后,当我继续使用 visual studio 单步执行代码时,push() 函数 returns 返回到 foreach 循环。从那一刻起,这个 Rec 的 ExtList 不再有任何元素。一旦 push() returns.
它们都消失了这里是完整的 Rec 结构。
struct Rec
{
public string strMatch;
ExtensionList extList;
public ExtensionList ExtList {
get { return extList??new ExtensionList();}
set { extList = value; }
}
};
您的 getter 为 ExtList
属性 returns 值,或者如果它为空,returns 一个新列表。然后调用对象的 getter 并改变该列表。该列表在任何时候都不会设置为 extList
属性。无论是 属性 getter,还是您初始化 Rec
的代码,都设置该字段。
令人惊讶的是,这实际上与您拥有可变结构这一事实没有任何关系,也就是说,可变结构仍然是邪恶的,您应该像避免瘟疫一样避免它们。您的 struct
应该是不可变的,或者是 class
.
我看不出 ExtensionsList
class 的原因。如前所述,逻辑可以直接实现到 Rec
中。
public struct Rec
{
public Rec(string match) : this()
{
Match=match;
Extensions=new List<string>();
}
public string Match { get; private set; }
public List<string> Extensions { get; private set; }
public void Push(params string[] ext)
{
if(ext.Contains("ALL__"))
{
Extensions=new List<string>() { "*" };
return;
}
if(Extensions.Intersect(ext).Any())
{
return;
}
Extensions.AddRange(ext);
}
}
用法相似:
public bool readAppConfig(string appConfigPath)
{
Recs=new Dictionary<string, List<Rec>>()
{
{"Headers", new List<Rec>()},
{"Ignores", new List<Rec>()},
{"Exceptions", new List<Rec>()}
};
foreach(string sectionName in Recs.Keys)
{
var recSection=ConfigurationManager.GetSection(sectionName) as NameValueCollection;
foreach(string key in recSection.AllKeys)
{
Rec r=new Rec(key);
r.Push(recSection[key].Split(';', ' '));
Recs[sectionName].Add(r);
}
}
return true;
}