当我使用字符数组</string>拆分String时,获取只有一个长度的List <string>

时间:2015-02-20 19:58:25

标签: c# list split datacontractserializer

我使用此属性来帮助用户过滤结果,方法是指定不应出现的内容。他们可以将自己的条款与INCLUDE_INTERPRET_SEPARATORS中的所有字符分开。 String在启动并关闭时保存为XML文件。

但是,List总是只有1个索引。我想知道它是否与通过XML反序列化加载值有关,但断点确认应用程序在启动时使用setter。

更新后,我确认分割将在不同的环境中运行。我仍然不知道为什么这段代码最初没有用。

下面的

_ExcludeExclude是有目的的不同类型。

private readonly char[] INCLUDE_INTERPRET_SEPARATORS = {';', '|', '+'};
private const string INCLUDE_SEPARATOR = ";";

private List<string> _Exclude = new List<string>();
[DataMember()]
public string Exclude
{
    get
    {
        return String.Join(INCLUDE_SEPARATOR, _Exclude);
    }
    set
    {
        string input = Utils.RemoveDiacritics(value);
        _Exclude = new List<string>(input.Split(INCLUDE_INTERPRET_SEPARATORS, StringSplitOptions.RemoveEmptyEntries));
        onPropertyChanged("Exclude");
    }
}

示例

在我的XML文件中,我有(除其他外)

 <Episode>9</Episode>
 <Exclude>WEB-DL;1080i;MPEG</Exclude>
 <FilterEpisode>true</FilterEpisode>

断点显示Exclude设置为

Index  Value                 Type
[0]    "WEB-DL;1080i;MPEG"   String

我是否遗漏了一些明显的事情?

更新

我做了一个test on dotnetfiddle,发现代码在简化的环境中工作,没有DataContractSerializer。

同样,当我添加一个额外的属性时,它可以工作:

    private readonly char[] INCLUDE_INTERPRET_SEPARATORS = {';', '|', '+'};
private const string INCLUDE_SEPARATOR = ";";

[IgnoreDataMember()]
public List<string> ExcludeList 
{ 
    get
    {
        return new List<string>(Exclude.Split(INCLUDE_INTERPRET_SEPARATORS, StringSplitOptions.RemoveEmptyEntries));
    }
}

private string _Exclude = "";
[DataMember()]
public string Exclude
{
    get
    {
        return _Exclude;
    }
    set
    {
        _Exclude = Utils.RemoveDiacritics(value);

        foreach (string x in ExcludeList)
        {
            System.Diagnostics.Debug.WriteLine(x);
        }

        onPropertyChanged("Exclude");
    }
}

更新2

我弄清楚问题是什么。从XML反序列化加载类对象时,INCLUDE_INTERPRET_SEPARATORS为空。字符串不会被拆分。通过将这些字段设置为静态,它们仍将在启动时初始化。

1 个答案:

答案 0 :(得分:1)

是的,你错过了一些东西。设置断点时,请检查_Exclude的值,而不是Exclude。