【问题标题】:Trimming entries in a List<string> after every write每次写入后修剪 List<string> 中的条目
【发布时间】:2013-07-05 16:39:46
【问题描述】:

我在List&lt;string&gt; 上重复工作以构建MyClass 的实例,但为简单起见(涉及很多正则表达式和IndexOf 操作),我目前必须修剪每一行每次操作后:

static MyClass Populate (\List<str> strList)
{
    MyClass myClassInstance = new MyClass();
    Operation1(ref strList, myClassInstance);
    TrimAllLines(strList);
    Operation2(ref strList, myClassInstance);
    TrimAllLines(strList);
    //...
    return myClassInstance;
}

有没有一种好方法(最好是直接替换),这样每次我写信给strList时,里面的每个字符串都会自动修剪?

我玩过的东西:

  • string 的包装器,用于修剪隐式转换。会丢失字符串 Intellisense,并且IEnumerables 不会同样隐式转换。
  • 使用索引器get { return base[index]; } set { base[index] = value.Trim(); } 继承List&lt;string&gt;。索引器不可覆盖。

【问题讨论】:

  • 您为什么将strList 传递为refList&lt;string&gt; 已经是一个引用类型。请记住,ref 指的是 变量,而不是
  • Eric Lippert:我知道我不必这样做;这更像是在提醒自己它是可变的,而字符串不是。
  • 这是一种非常糟糕的编程习惯。仅在需要修改变量时传递ref

标签: c# string list


【解决方案1】:

有没有一种好方法(最好是直接替换),这样每次我写信给strList时,里面的每个字符串都会自动修剪?

你不想要List&lt;T&gt;的行为,所以不要使用List&lt;T&gt;。相反,让您的方法采用 IList&lt;T&gt; 并提供该接口的实现来满足您的需求。

实现可能只是一个包含私有List&lt;T&gt; 的包装类。

另请参阅此相关问题:

How do I override List<T>'s Add method in C#?

【讨论】:

    【解决方案2】:

    你可以使用

    System.Collections.ObjectModel.ObservableCollection

    而不是你的列表

    然后做一些类似的事情:

        ObservableCollection<string> myCollection = new ObservableCollection<string>();
    
        void Init()
        {
            myCollection.CollectionChanged +=myCollection_CollectionChanged;
        }
    
        void myCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            myCollection.CollectionChanged -= myCollection_CollectionChanged;
            //could be a delete / clear / remove at operation
            if (e.NewItems != null)
            {
                for (int i = 0; i < e.NewItems.Count; i++)
                {
                    string str = (string)e.NewItems[i];
                    //the added value could be null
                    if (str != null)
                    {
                        string trimmed = str.Trim();                        
                        if (!trimmed.Equals(str))
                        {
                            myCollection[e.NewStartingIndex + i] = str.Trim();
                        }
                    }
                }
            }
            myCollection.CollectionChanged += myCollection_CollectionChanged;
        }
    

    之后,每次修改 ObservableCollection 时,都会自动修剪添加的项目。

    【讨论】:

    • 由于您的IndexOf(),添加到集合现在是一个 O(n) 操作。这可能会大大降低代码速度。
    • @svick 提出了一个很好的观点;这可能会大大减慢收集速度。我注意到您可以通过首先检查str == str.Trim() 来加快速度。如果是这样,则无需进行昂贵的搜索。
    • 不需要IndexOf()调用:可以参考args.NewStartingIndex获取第一项的索引;后续项目将从那里连续。
    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多