Queue和Stack绝大多数情况是不需要遍历的,因为它们设计出来不是为了这个功能。
每种泛型集合都有自己使用的场景。
如果要遍历 用foreach或者linq都可以 不需要先ToArray。
你好,希望对你有所帮助
using System;
using System.Collections.Generic;。
using System.Text;。
namespace AntSystem。
public class AA。
{
/**//// <summary>。
/// 对信息量的重视程度。
/// </summary>。
private int alpha;。
/**//// <summary>。
/// 启发式信息的受重视程度。
/// </summary>。
private int beta;。
/**//// <summary>。
/// 信息素的挥发速度。
/// </summary>。
private double lo;。
/**//// <summary>。
/// 城市距离矩阵。
/// </summary>。
private double[,] City;。
/**//// <summary>。
/// 信息素矩阵。
/// </summary>。
private double[,] Message;。
/**//// <summary>。
/// opneList用于存放下一步可行城市。
/// </summary>。
private Queue<int> openList=new Queue<int> ();。
/**//// <summary>。
/// closedList用于存放已经访问过的城市。
/// </summary>。
private Queue<int> closedList=new Queue<int> ();。
/**//// <summary>。
/// 储存较好的路径。
/// </summary>。
private Queue <int> BestList=new Queue<int> ();。
private int Pro_time = 0;。
/**//////////////////////////////////////////////////////////。
/// <summary>。
/// 构造函数:形成城市距离和信息素矩阵。
/// </summary>。
/// <param name="city">城市距离矩阵</param>。
/// <param name="Lo"> 信息素的挥发速度</param>。
public AA(double[,] city,double Lo,int Alpha,int Beta)。
{
alpha = Alpha;。
beta = Beta;。
lo=Lo;。
int temp = Convert.ToInt32( Math.Sqrt(city.Length));。
City=new double [temp,temp];。
Message=new double [temp,temp];。
for (int i = 0; i < temp; i++)。
{
for (int j = 0; j < temp; j++)。
{。
City[i, j] = city[i, j];。
}。
}
//初始化信息素矩阵。
for (int i = 0; i < temp; i++)。
{
for (int j = 0; j < temp; j++)。
{。
if (i != j)。
{。
Message[i, j] = (double)1 / (temp * temp - temp);。
}。
}。
}
}
/**/////////////////////////////////////////////////////////////。
/// <summary>。
/// 改变信息素矩阵,closed_list为较好的路径。
/// </summary>。
/// <param name="closed_list"></param>。
private void Change_Message(Queue<int> closed_list)。
{
lock (this)。
{
int[] temp_Array = new int[closed_list.Count];。
temp_Array = closed_list.ToArray();。
for (int i = 0; i < closed_list.Count - 1; i++)。
{。
Message[temp_Array[i], temp_Array[i + 1]] = Message[temp_Array[i], temp_Array[i + 1]] + lo / ((1 - lo) *Convert.ToInt32(Get_Weight(closed_list)+1));。
}。
Message[temp_Array[temp_Array.Length - 1], temp_Array[0]] = Message[temp_Array[temp_Array.Length - 1], temp_Array[0]] + lo / ((1 - lo) *Convert.ToInt32(Get_Weight(closed_list)));。
for (int i = 0; i < closed_list.Count; i++)。
{。
for (int j = 0; j < closed_list.Count; j++)。
{。
Message[i, j] = (1 - lo) * Message[i, j];。
}。
}。
}
}
/**////////////////////////////////////////////////////////////////。
/// <summary>。
/// 输入一个链表,计算出其对应的总路径。
/// </summary>。
/// <param name="closed_list"></param>。
/// <returns></returns>。
public double Get_Weight(Queue <int> closed_list)。
{
lock (this)。
{
double sum = 0;。
int[] temp_Array = new int[closed_list.Count];。
temp_Array = closed_list.ToArray();。
for (int i = 0; i < Convert.ToInt32(temp_Array.Length) - 1; i++)。
{。
sum = sum + City[temp_Array[i], temp_Array[i + 1]];。
}。
sum = sum + City[temp_Array[temp_Array.Length - 1], temp_Array[0]];。
return sum;。
}
}
/**///////////////////////////////////////////////////////////////。
/// <summary>。
/// 产生到i城市后,下一个可走城市的集合。并将城市编号加入到openList中。
/// 产生的城市不可以已经存在closedList中。
/// </summary>。
/// <param name="i"></param>。
private void NextCity()。
{
openList.Clear();。
int temp_int=Convert.ToInt32(Math.Sqrt(City.Length));。
for (int i = 0; i < temp_int; i++)。
{
if (closedList.Contains(i) ==false)。
{。
openList.Enqueue(i);。
}。
}
}
/**///////////////////////////////////////////////////////////////。
/// <summary>。
/// 选择应该走那条路,选择完路A后,清空openList,再把A加入到openList中。
/// </summary>。
/// <returns></returns>。
private int choiceRoute()。
{
int index = 0;//记录选择的城市。
Random random = new Random();。
double random_value =(double) random.NextDouble();//随机选择的概率。
int[] temp_Array=new int [openList.Count];。
temp_Array=openList.ToArray();。
double sum_Message = 0;//openList所有节点的总信息量。
for (int i = 0; i < openList.Count; i++)。
{
double eta = 1 / City[Pro_time, temp_Array[i]];。
sum_Message = sum_Message +Math.Pow(Message[Pro_time, temp_Array[i]],alpha)*Math.Pow (eta,beta);。
}
double temp=0;。
for (int j = 0; j < openList.Count; j++)。
{
double eta = 1 / City[Pro_time, temp_Array[j]];。
temp=temp+Math.Pow(Message[Pro_time,temp_Array[j]],alpha)*Math.Pow(eta,beta)/sum_Message;。
if (temp > random_value)。
{。
index = temp_Array [j];。
break;。
}。
}
openList.Clear();。
openList.Enqueue(index);。
return index;。
}
/**//////////////////////////////////////////////////////////////。
public Queue<int> Main_DW()。
{
BestList.Clear();。
/**////共循环20次。
for (int i = 0; i < 4; i++)。
{
/**////共有n只蚂蚁n=City'number Convert.ToInt32(Math.Sqrt(City.Length))。
for (int j = 0; j < Convert.ToInt32(Math.Sqrt(City.Length)); j++)。
{。
openList.Enqueue(0);。
closedList.Clear();。
while (openList.Count != 0 && closedList.Count != Convert.ToInt32(Math.Sqrt(City.Length)))。
{。
int temp = openList.Dequeue();。
Pro_time = temp;。
closedList.Enqueue(temp);。
if (openList.Count == 0 && closedList.Count == Convert.ToInt32(Math.Sqrt(City.Length)))。
{。
if (BestList.Count == 0)。
{。
int[] temp_Array = new int[Convert.ToInt32(Math.Sqrt(City.Length))];。
temp_Array = closedList.ToArray();。
for (int k = 0; k < Convert.ToInt32(Math.Sqrt(City.Length)); k++)。
{。
BestList.Enqueue(temp_Array[k]);。
}。
}。
if (Get_Weight(BestList) > Get_Weight(closedList))。
{。
BestList.Clear();。
int[] temp_Array = new int[Convert.ToInt32(Math.Sqrt(City.Length))];。
temp_Array = closedList.ToArray();。
for (int k = 0; k < Convert.ToInt32(Math.Sqrt(City.Length)); k++)。
{。
BestList.Enqueue(temp_Array[k]);。
}。
}。
}。
NextCity();。
choiceRoute();。
}。
}。
Change_Message(BestList);//修改信息量。
}
return BestList;。
}
}
队列只能移除第一个对象,如果想把某个对象移除,它之前的所有对象都得移除。
方法:Dequeue()
如果想移除某个元素,请把队列转换为List。
List l = new List(q.ToArray())。
public static string QueueString(string input){。
var arr = new System.Collections.ArrayList();。
var lines = input.Split(' ',',',',');。
int min,max,tmp = 1;。
max = min = int.Parse(lines[0]);。
foreach (var line in lines) {。
tmp = int.Parse(line);。
if ((tmp - max)>1) {。
arr.Add(string.Format("{0}-{1}",min,max));。
max = min = tmp;。
}else{。
max = tmp;。
}。
}
if ((tmp == min)||(tmp == max)) {。
arr.Add(string.Format("{0}-{1}",min,max));。
}
return string.Join(";",arr.ToArray());。
}
用法
var str = QueueString("1,2,3,5,7,8,9,15,18,19,24");。
两种方法:
一行一行读,读到文件尾,你就知道哪行是最好一行了。可以考虑使用System.IO.File.ReadAllLines()方法,返回值是字符串数组。
File.ReadAllLines 方法 (System.IO)。
https://msdn.microsoft.com/zh-cn/library/System.IO.File.ReadAllLines(v=vs.110).aspx。
从流的末尾一个字节一个字节往前读,读到换行符以后,再从这个位置读到文件结尾。