约束(Constraints)

 很多时候须要确保添加到泛型表中的元素满足一定的约束(比如,从给定的基类派生,或者实现一个特定的接口)。

 

   public class Employee:IComparable<Employee>
    {
        private string name;
        public Employee(string name)
        {
            this.name = name;
        }

        public override string ToString()
        {
            return this.name;
        }

        #region IComparable<Employee> 成员

        public int CompareTo(Employee rhs)   //如果直接继承IComparable的话,那么Employee对应的是Object
        {
            return this.name.CompareTo(rhs.name);
        }
        #endregion

        public bool Equals(Employee rhs)
        {
            return this.name == rhs.name;
        }
    }
  //结点必须实现T的Node的IComparable
    //使用where关键字
    //约束Node只能接受实现了IComparable接口的项
    public  class Node<T>:IComparable<Node<T>> where T:IComparable<T>
    {
        //成员字段
        private T data;
        private Node<T> next = null;
        private Node<T> prev = null;

        //构造方法
        public Node(T data)
        {
            this.data = data;
        }

        //属性
        public T Data
        {
            get 
            {
                return this.data;
            }
        }
        public Node<T> Next
        {
            get { return this.next; }
        }

        #region IComparable<Node<T>> 成员

        public int CompareTo(Node<T> rhs)
        {
            //因为存在约束所以可行
            return data.CompareTo(rhs.data);
        }

        #endregion

        public bool Equals(Node<T> rhs)
        {
            return this.data.Equals(rhs.data);
        }

        //方法
        public Node<T> Add(Node<T> newNode)
        {
            if (this.CompareTo(newNode) > 0)  //在我之前
            {
                newNode.next = this; //新结点指向我

                //如果前面有结点,将它设为指向
                //新结点,作为后继
                if (this.prev != null)
                {
                    this.prev.next = newNode;
                    newNode.prev = this.prev;
                }

                //将当前结点的prev指向新结点
                this.prev = newNode;
                //返回newNode,如果它是新的头结点
                return newNode;
            }
            else   //在我之后
            {
                //如果后面有结点,新结点一起传递,一共比较
                if (this.next != null)
                {
                    this.next.Add(newNode);
                }
                else    //没有后续结点了,所以将新结点设为后续结点,将其prev设为指向我
                {
                    this.next = newNode;
                    newNode.prev = this;
                }
                
                return this;
            }
        }

        public override string ToString()
        {
            string output = data.ToString();
            if (next != null)
            {
                output += ", " + next.ToString();
            }
            return output;
        }
    }
 public class LinkedList<T> where T:IComparable<T>
    {
        //成员字段
        private Node<T> headNode = null;

        //索引器
        public T this[int index]
        {
            get
            {
                int ctr = 0;
                Node<T> node = headNode;
                while (node != null && ctr <= index)
                {
                    if (ctr == index)
                    {
                        return node.Data;
                    }
                    else
                    {
                        node = node.Next;
                    }
                    ++ctr;
                }
                throw new ArgumentOutOfRangeException();
            }
        }

        public LinkedList()
        { 
        }

        //方法
        public void Add(T data)
        {
            if (headNode == null)
            {
                headNode = new Node<T>(data);
            }
            else
            {
                headNode = headNode.Add(new Node<T>(data));
            }
        }

        public override string ToString()
        {
            if (this.headNode != null)
            {
                return this.headNode.ToString();
            }
            else
            {
                return string.Empty;
            }
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Run();
        }
        public void Run()
        {
            LinkedList<int> myLinkedList = new LinkedList<int>();
            Random rand = new Random();
            Console.Write("Adding: ");

            for (int i = 0; i < 10; i++)
            {
                int nextInt = rand.Next(10);
                Console.Write("{0}  ", nextInt);
                myLinkedList.Add(nextInt);
            }
            LinkedList<Employee> employees = new LinkedList<Employee>();
            employees.Add(new Employee("Douglas"));
            employees.Add(new Employee("Paul"));
            employees.Add(new Employee("George"));
            employees.Add(new Employee("Ringo"));
            Console.WriteLine("\nRetrieving collections...");
            Console.WriteLine("Integers: " + myLinkedList);
            Console.WriteLine("Employees: " + employees);
        }
    }


 这个例子中,一开始就声明了一个能够插入链表的类:

public Class Employee:IComparable<Employee>

这个声明表明,Employee对象是可以进行比较的,可以看到Employee类实现了必需的方法(CompareTo和Equals)。请注意,这些方法都是类型安全的(它们知道传给自己的参数将是Employee类型的)。LinkedList本身声明为只能保存实现了IComparable的类型:

public Class LinkedList<T> where T:IComparable<T>

因此,可以保证能够对链表进行排序。LinkedList保存了一个Node类型的对象。Node也实现了IComparable,而且要求它的数据成员也要实现IComparable:

public class Node<T>:IComparable<Node<T>> where T:IComparable<T>

这些约束使得Node的CompareTo方法的实现既简单又安全,因为Node知道将与数据可以比较的其他Node进行比较:

public int CompareTo(Node<T> rhs)

{

     //因为存在约束所以可行

    return data.CompareTo(rhs.data);

}

请注意,我们无需测试rhs是否实现了IComparable,我们已经约束Node只保存实现了IComparable的数据。
 


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
x_Iij_square=sdpvar(32,N,'full');%电流平方 x_ui_square=sdpvar(33,N,'full');%电压平方 x_pij=sdpvar(32,N,'full');%线路有功功率 x_qij=sdpvar(32,N,'full');%线路无功功率 x_Pdg=sdpvar(3,N,'full');%dg功率 u_Pdg=binvar(3,N,'full');%dg出力状态 x_Pil=sdpvar(2,N,'full');%切负荷功率 u_Pil=binvar(2,N,'full');%切负荷状态 x0_ug=binvar(3,N,'full');%机组启动 x0_vg=binvar(3,N,'full');%机组停止 x_R=sdpvar(1,N,'full');%备用负荷 %% 定义约束条件 Constraints=[]; P_dg=sdpvar(33,24,'full');%将dg出力情况放入对应的节点 for i=1:33 if i==7 Constraints=[Constraints,P_dg(i,:)==x_Pdg(1,:)]; elseif i==24 Constraints=[Constraints,P_dg(i,:)==x_Pdg(2,:)]; elseif i==25 Constraints=[Constraints,P_dg(i,:)==x_Pdg(3,:)]; else Constraints=[Constraints,P_dg(i,:)==0]; end end P_il=sdpvar(33,24,'full');%将IL合同约束放入对应的节点 for i=1:33 if i==8 Constraints=[Constraints,P_il(i,:)==x_Pil(1,:)]; elseif i==25 Constraints=[Constraints,P_il(i,:)==x_Pil(2,:)]; else Constraints=[Constraints,P_il(i,:)==0]; end end Constraints=[Constraints,x_ui_square(1,:)==12.66^2]; %平衡节点每小时电压平方 Constraints=[Constraints,x_Iij_square>=0]; % Constraints=[Constraints,x_pij(1,:)>=0]; %% 支路欧姆定律 for r=1:32 Constraints=[Constraints,x_ui_square(Branch(r,2),:)-... x_ui_square(Branch(r,3),:)+(r_ij(r)^2+x_ij(r)^2)*x_Iij_square(r,:)-... 2*(r_ij(r)*x_pij(r,:)+x_ij(r)*x_qij(r,:))==0]; end %dg爬坡约束 for t=1:23 for i=1:3 Constraints=[Constraints,x_Pdg(i,t+1)-x_Pdg(i,t)<=vup]; Constraints=[Constraints,x_Pdg(i,t)-x_Pdg(i,t+1)<=vdn]; end end %IL合同约束 Constraints=[Constraints,0<=x_Pil<=Pilmax.*u_Pil]; %dg最小启停时间约束 for i=1:3 Constraints=[Constraints,consequtiveON([onoffhistory(i,:) u_Pdg(i,:)],Tmup)]; Constraints=[Constraints,consequtiveON(1-[onoffhistory(i,:) u_Pdg(i,:)],Tmd)]; end for t=2:N%公式7这段代码什么意思
06-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值