110,552
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace Arr
{
/*
* 实现功能:
* 向数组中添加一个值,不需再手动扩展数组大小
* 两个数组相加
* 去除数组中指定的项
* 去除数组中重复的项(数字或字符串都行。字符串有两种算法,各位同仁自行比较优劣)
* 移除数组中部分相同的项,估计不常用,以前自己需要时写上去的,很久没用了。
* 对数组重新排序(数字数组可由大到小或由小到大,带数字和字符串数组仅进行了降序排列)
* 获取数组内重复最多的项,仅做了string数组,数字数组如果大家需要,可自行添加,算法一样。
* PS:本人对C#不算老鸟,如果算法中有失误的地方,还请原谅。
* 交流QQ:9729052
*/
class array
{
#region 向数组添加一个值
public static string[] ArrayAddItem(string[] arr, string item)
{
string[] _arr = new string[arr.Length + 1];
arr.CopyTo(_arr, 0);
_arr[arr.Length] = item;
return _arr;
}
public static string[][] ArrayAddItem(string[][] motherArray, string[] arr)
{
string[][] _arr = new string[motherArray.Length + 1][];
motherArray.CopyTo(_arr, 0);
_arr[motherArray.Length] = arr;
return _arr;
}
#endregion
#region 去除数组中指定的项
/// <summary>
/// 去除数组中指定的项
/// </summary>
/// <param name="arr">一个字符串数组</param>
/// <param name="index">索引项</param>
/// <returns></returns>
public static string[] RemoveAt(string[] arr, int index)
{
if (index >= arr.Length || index < 0)
{
return arr;
}
else
{
string[] newArr = new string[arr.Length - 1];
Array.Copy(arr, 0, newArr, 0, index);
Array.Copy(arr, index + 1, newArr, index, newArr.Length - index);
return newArr;
}
}
/// <summary>
/// 去除数组中指定的项
/// </summary>
/// <param name="arr">一个数字数组</param>
/// <param name="index">索引项</param>
/// <returns></returns>
public static int[] RemoveAt(int[] arr, int index)
{
if (index >= arr.Length || index < 0)
{
return arr;
}
else
{
int[] newArr = new int[arr.Length - 1];
Array.Copy(arr, 0, newArr, 0, index);
Array.Copy(arr, index + 1, newArr, index, newArr.Length - index);
return newArr;
}
}
#endregion
#region 数组相加
/// <summary>
/// 数组相加
/// </summary>
/// <param name="arrays">由一维数组组成的二维数组</param>
/// <returns></returns>
public static string[] arrayAdd(string[][] arrays)
{
/*例:
* string[] array1={ };
*string[] array2={"1","2","3"};
*string[] array3={"ab","cd","ef"};
*string[][] arrays={array1,array2,array3};
*string[] newArray=array.arrayAdd(arrays);
*/
int itemsNumber = 0;
for (int i = 0; i < arrays.Length; i++)
{
if (arrays[i] == null)
continue;
else
itemsNumber += arrays[i].Length;
}
int endItemNumber = 0;
string[] newArray = new string[itemsNumber];
for (int i = 0; i < arrays.Length; i++)
{
if (arrays[i] != null)
{
arrays[i].CopyTo(newArray, endItemNumber);
endItemNumber += arrays[i].Length;
}
}
return newArray;
}
public static int[] arrayAdd(int[][] arrays)
{
int itemsNumber = 0;
//System.Windows.Forms.MessageBox.Show(arrays.Length + ":走到这里了");
for (int i = 0; i < arrays.Length; i++)
{
if (arrays[i] == null)
continue;
else
itemsNumber += arrays[i].Length;
}
int endItemNumber = 0;
int[] newArray = new int[itemsNumber];
for (int i = 0; i < arrays.Length; i++)
{
if (arrays[i] != null)
{
arrays[i].CopyTo(newArray, endItemNumber);
endItemNumber += arrays[i].Length;
}
}
return newArray;
}
#endregion
#region 去除数组内重复的项
#region 去除数组内重复的项,算法1
public static string[] RemoveRepeatItem(string[] arr)
{
while (arr.Length != _RemoveRepeatItem(arr).Length)
{
int size = arr.Length;
arr = _RemoveRepeatItem(arr);
}
return arr;
}
private static string[] _RemoveRepeatItem(string[] arr)
{
/*
* 下面这种方法以前摘自网上,也可以去除重复,但是如果遇到大量同一个值时,则会出错
* 如 string[] t = { "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm", "htm" };
* 用while循环比较获取的值,直到精简到无重复值
*/
for (int i = 0; i < arr.Length; i++)//检查重复内容,如果有重复内容,则将之删除
{
string temStr = arr[i];
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[j] == temStr)
{
arr = RemoveAt(arr, j);//去除当前重复值以后,会对arr重新赋值,而长度也会重新赋值,则永远也走不到arr初始长度的最后
}
}
}
return arr;
}
#endregion
#region 去除数组内重复的项,算法2
/// <summary>
/// 去除数组内重复的项
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
public static string[] RemoveRepeatItems(string[] arr)
{
int nullNumber = 0;
for (int i = 0; i < arr.Length; i++)
{
string str = arr[i];
for (int j = i + 1; j < arr.Length; j++)
{
if (str != null && arr[j] == str)
{
arr[j] = null;
nullNumber++;
}
}
}
string[] newArray = new string[arr.Length - nullNumber];
int n = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != null)
{
newArray[n] = arr[i];
n++;
}
}
return newArray;
}
#endregion
#region 移除数组中部分相同的项
/// <summary>
/// 去除数组内部分相同的项。如:"姓名,号码:00000000000,登记时间:2009-12-12","姓名,号码:00000000000,登记时间:2009-21-21",正则表达式用\d{11},则两项只留一项
/// </summary>
/// <param name="arr">数组</param>
/// <param name="regularText">要检查的正则表达式模式文本</param>
/// <returns></returns>
public static string[] RemoveRepeatItems(string[] arr, string regularText)
{
Regex reg = new Regex(regularText);
for (int i = 0; i < arr.Length; i++)
{
string temStr = arr[i];
string regText = reg.Match(temStr).Groups[0].Value;//arr[i]中符合正则表达式的文本
for (int j = 0; j < arr.Length; j++)
{
if (j != i && temStr != null)
{
Regex reg1 = new Regex(regularText);
string reg1Text = reg1.Match(arr[j]).Groups[0].Value;//arr[j]符合正则表达式的文本
if (reg1Text == regText)//如果正则表达式匹配文本都相同,则视为重复
arr = RemoveAt(arr, j);
}
}
}
return arr;
}
#endregion
#region 移除数组中相同的数字项
/// <summary>
/// 去除数组中相同数字的项
/// </summary>
/// <param name="arr">一个int数组</param>
/// <returns></returns>
public static int[] RemoveRepeatItems(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
for (int j = i; j < arr.Length; j++)
{
if (j != i && arr[j] == arr[i])
arr = RemoveAt(arr, j);
}
}
return arr;
}
#endregion
#endregion
#region 对数组重新排序
#region 对数字数组进行排列
/// <summary>
/// 对数字进行重新排序
/// </summary>
/// <param name="arr">一个由数字组成的一维数组</param>
/// <param name="MaxToMin">是否按由大到小排列</param>
/// <returns></returns>
public static int[] ReSequence(int[] arr, bool MaxToMin)
{
if (MaxToMin)
return ReSequence(arr);
bool flag; //设一个标志
for (int i = 0; i < arr.Length; i++)
{
flag = false;
for (int j = 0; j < arr.Length - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true; //标志设为true
}
}
if (flag == false)
continue;
}
return arr;
}
/// <summary>
/// 对数组按从大到小的顺序排列
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
private static int[] ReSequence(int[] arr)
{
bool flag; //设一个标志
for (int i = 0; i < arr.Length; i++)
{
flag = false;
for (int j = 0; j < arr.Length - 1 - i; j++)
{
if (arr[j] < arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true; //标志设为true
}
}
if (flag == false)
continue;
}
return arr;
}
/// <summary>
/// 自己想的排序法。不知道是什么排序法。
/// </summary>
/// <param name="arr">一个由数字组成的数组</param>
/// <param name="t">仅作调用区别,可以是任意字符</param>
/// <returns></returns>
public static int[] ReSequence(int[] arr, string t)
{
for (int i = 0; i < arr.Length; i++)
{
for (int j = i; j < arr.Length; j++)//遍历数组中的每一项,如果项值大于当前项arr[i],则互置
{
if (arr[j] > arr[i])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
#endregion
#region 对包含有数字的字符串数组进行排列
/// <summary>
/// 对包含有数字的字符串数组进行降序排列。如果不包含数字,那么将之排列在最后。如果所包含数字不在int范围内,则出错
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
public static string[] ReSequence(string[] arr)
{
string[] tempArr = arr;
string[] Removes = new string[tempArr.Length];//创建一个新数组,用于保存不包含有数字的项。现在假设它的长度和arr相同
int RemovesNumber = 0;//不包含有数字的项的长度
Regex regForNumber = new Regex("\\d{1,6}");
for (int i = 0; i < tempArr.Length; i++)
{
if (!regForNumber.IsMatch(tempArr[i]))//如果当前项中没有检测到数字,则从参数数组中删除,并将值保存到新数组
{
Removes[RemovesNumber] = tempArr[i];
RemovesNumber++;//如果当前项不包含数字,则RemovesNumber加1
tempArr = RemoveAt(tempArr, i);//去除不包含数字的数组
}
}
//经过上一步操作,tempArr数组中所有的项都包含有数字
string[] temRemoves = new string[RemovesNumber];//保存不包含数字的项
for (int i = 0; i < temRemoves.Length; i++)//将有效值复制到新的数组
temRemoves[i] = Removes[i];
Removes = temRemoves;//重新设置数组。此时该数组中的项都不包含有符合设定的数字
for (int i = 0; i < tempArr.Length; i++)//对包含有数字的数组进行数字排序
{
for (int j = i; j < tempArr.Length; j++)//遍历数组中的每一项,如果项值大于当前项arr[i],则互置
{
int num1 = Convert.ToInt32(regForNumber.Match(tempArr[j]).Groups[0].Value);
int num2 = Convert.ToInt32(regForNumber.Match(tempArr[i]).Groups[0].Value);
if (num1 > num2)
{
string temp = tempArr[i];
tempArr[i] = tempArr[j];
tempArr[j] = temp;
}
}
}
string[][] arrs = { tempArr, Removes };//合并数组
return arrayAdd(arrs);
}
#endregion
#endregion
#region 获取数组内重复最多的项值
/// <summary>
/// 获取数组内重复最多的项值
/// </summary>
/// <param name="arr">一个字符串数组</param>
/// <returns></returns>
public static string GetMostItemValue(string[] arr)
{
int theMostNumber = 0;
string value = null;
for (int i = 0; i < arr.Length; i++)
{
int itemNumber = 0;
string item = arr[i];
for (int j = i + 1; j < arr.Length; j++)
{
string temItem = arr[j];
if (temItem == item)
{
itemNumber++;
}
}
if (itemNumber > theMostNumber)//如果当前项重复数大于原来重复数,视当前数最大
{
theMostNumber = itemNumber;
value = item;
}
}
return value;
}
#endregion
}
}