Вы хотите, чтобы начальные / конечные пробелы разрешались во всей строке или вокруг каждого отдельного адреса?
Для первого вашего регулярного выражения должно быть
/^(\s*([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([,.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+\s*)*$/
, а для последнего
/^(\s*([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25}\s*)+([,.](\s*([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+\s*)*$/
То, что Вы хотите, List<T>
, где Вы всегда звоните RemoveAt(0)
, когда Вы хотите получить объект от Queue
. Все остальное - то же, действительно (звонящий Add
добавил бы объект в конец Queue
).
На самом деле это побеждает целую цель Очереди и класса, Вы в конечном счете придумаете желание, нарушают семантику FIFO в целом.
Кто-то, вероятно, разработает лучшее решение, но от того, что я вижу, необходимо будет возвратить новый Объект очереди в Вашем Удалять метод. Вы захотите проверить, выходит ли индекс за пределы, и я могу иметь упорядочивание объектов, добавляемых неправильно, но здесь являюсь быстрым и грязным примером, который мог быть превращен в расширение довольно легко.
public class MyQueue<T> : Queue<T> {
public MyQueue()
: base() {
// Default constructor
}
public MyQueue(Int32 capacity)
: base(capacity) {
// Default constructor
}
/// <summary>
/// Removes the item at the specified index and returns a new Queue
/// </summary>
public MyQueue<T> RemoveAt(Int32 index) {
MyQueue<T> retVal = new MyQueue<T>(Count - 1);
for (Int32 i = 0; i < this.Count - 1; i++) {
if (i != index) {
retVal.Enqueue(this.ElementAt(i));
}
}
return retVal;
}
}
решение David Anderson является, вероятно, лучшим, но имеет немного служебные. Вы используете пользовательские объекты в очереди? если так, добавьте, что булевской переменной нравится отмена
, Согласовывают с Вашими рабочими, которые обрабатывают очередь, если та булевская переменная установлена, и затем пропустите ее.