我正在List<string>
重复工作以构建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,IEnumerable
也不会隐式转换。List<string>
继承get { return base[index]; } set { base[index] = value.Trim(); }
。索引器不可覆盖。答案 0 :(得分:12)
是否有一种好方法(最好是直接替换),以便每次写入
strList
时,其中的每个字符串都会被自动修剪?
您不希望List<T>
的行为,因此不使用List<T>
。相反,让您的方法采用IList<T>
并提供执行您想要的接口的实现。
实现可能只是一个包含私有List<T>
的包装类。
另见相关问题:
答案 1 :(得分:1)
您可以使用
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时,都会自动修剪添加的项目。