using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//Queue队列,特性先进先出. 在一些项目中我们会遇到对一些数据的Check,
// 如果数据不符合条件将会把不通过的信息返回到界面。
//但是对于有的数据可能会Check很多条件,如果一个数据一旦很多条件不通过,
//那么全部错误返回到界面,可能会让用户束手无策。我们有时候往往在一个流程中。
//只将Check流程中第一个不符合条件的错误提示给用户,让用户修改。
//首先我们就想到了队列,通过队列将所有的Check方法注册,然后依次出列。执行。
// Demo背景:
// XX公司招人,对员工的居住地点,姓氏,年龄都有要求.
namespace 队列小案例
{
public class Person
{
public string Name { get; set; }
public string Address { get; set; }
public int Age { get; set; }
}
public class ErrorMessage
{
public string ErrorCode { get; set; }
public string ErrorInfo { get; set; }
public override string ToString()
{
return string.Format("{0}:{1}", ErrorCode, ErrorInfo);
}
}
// Note:Queue<Func<Person, ErrorMessage>>
//通过Queue定义了一个fun()委托,
//然后添加了CheckName和CheckAge方法.分别将方法注册到队列中,
//然后再出对,执行每一个Check方法,一旦遇到Check不通过,然后就跳出循环.
class Program
{
static void Main(string[] args)
{
Person person = new Person()
{
Name = "Frank Zhang",
Address = "Chengdu",
Age = 60
};
Queue<Func<Person, ErrorMessage>> myQueue = new Queue<Func<Person, ErrorMessage>>();
ErrorMessage errorMessage = null;
myQueue.Enqueue(CheckName);
myQueue.Enqueue(CheckAge);
var count = myQueue.Count;
for (int i = 0; i < count; i++)
{
var checkMethod = myQueue.Dequeue();
errorMessage = checkMethod(person);
if (errorMessage != null)
{
Console.WriteLine(errorMessage.ToString());
break;
}
}
Console.ReadKey();
}
public static ErrorMessage CheckName(Person person)
{
if (person != null && person.Name.EndsWith("Zhang"))
{
return new ErrorMessage() { ErrorCode = "Error_001", ErrorInfo = "不招姓张的" };
}
return null;
}
public static ErrorMessage CheckAge(Person person)
{
if (person != null && person.Age > 50)
{
return new ErrorMessage() { ErrorCode = "Error_002", ErrorInfo = "不招老年人" };
}
return null;
}
}
}