![]() |
Languages »
C# »
Generics
Beginner
License: The Code Project Open License (CPOL)
Useful Generic Array FunctionsBy Yang YuUseful Generic Array Functions used to append, resize, remove elements in an array |
C# (C#1.0, C#2.0, C#3.0), Windows (WinXP, Vista), .NETCF, .NET (.NET2.0, .NET3.0, .NET3.5), Architect, Dev, Design
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
The standard .NET Framework offers quite a few generic functions to manipulate arrays, however there are some functionalities where extra code will be needed such as appending to the array, removing an element from the array, or removing all elements that fall under a condition.
You should have some basic knowledge of generic classes, lists, arrays, etc.
The Array object contains some useful generic functionalities such as:
ConvertAll<T,O> Exists<T> Find<T> Resize<T> TrueForAll<T> However, these functionalities by themselves sometimes do not get the job done. This is why I've extended the functionalities a bit more.
Basically the code is very simple and gets the job done.
class ArrayEx {
/// <summary>
/// Appends a list of elements to the end of an array
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <param name="items"></param>
public static void Append<T>(ref T[] array, params T[] items)
{
int oldLength = array.Length;
//make room for new items
Array.Resize<T>(ref array, oldLength + items.Length);
for(int i=0;i<items.Length;i++)
array[oldLength + i] = items[i];
}
/// <summary>
/// Remove an Array at a specific Location
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="index">index to remove at</param>
/// <param name="list">The Array Object</param>
public static void RemoveAt<T>(int index, ref T[] list)
{
//pre:
if (index < 0 || list == null | list.Length == 0) return;
//move everything from the index on to the left one then remove last empty
if (list.Length > index + 1)
for (int i = index + 1; i < list.Length; i++)
list[i - 1] = list[i];
Array.Resize<T>(ref list, list.Length - 1);
}
///
///<summary> Thanks to homer.
/// Remove all elements in an array satisfying a predicate
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">The Array Object</param>
/// <param name="condition">A Predicate when the element shall get removed under.
/// </param>
/// <returns>Number of elements removed</returns>
public static int RemoveAll<T>(ref T[] list, Predicate<T> condition)
{
if (null == condition || null == list || 0 == list.Length) return 0;
int length = list.Length;
int destinationIndex = 0;
T[] destinationArray = new T[length];
for (int i = 0; i < list.Length; i++)
{
if (!condition(list[i]))
{
destinationArray[destinationIndex] = list[i];
destinationIndex++;
}
}
if (destinationIndex != length)
{
Array.Resize<T>(ref destinationArray, destinationIndex);
list = destinationArray;
}
return length - destinationIndex;
}
}
public static void Append<T>(ref T[] array, params T[] items)
This function takes any array and appends more elements at the end of the array keeping the size of the array equal to the number of elements.
Keep in mind that you do not want to be doing this over and over again since every append will cost performance. However, if utilized correctly, meaning the items being appended only happens at the end of an operation, then this will be fine.
string[] strArray = new string[] { "a", "b", "c" };
string[] strArray2 = new string[] { "d", "e", "f" };
// appends d e f to the first array
ArrayEx.Append<string>(ref strArray, strArray2);
// appends one more element
ArrayEx.Append<string>(ref strArray, "g");
Console.Out.Write(string.Join(strArray));
public static void RemoveAt<T>(int index, ref T[] list)
This method will remove an element at a specific location like the IList.RemoveAt and return the element removed.
string[] strArray = new string[] { "a", "b", "c" };
// remove element b
string Element = ArrayEx.RemoveAt<string>(1,ref strArray);
public static int RemoveAll<T>(ref T[] list, Predicate<T> condition)
This method will remove all elements from an Array satisfying a conditional predicate.
The function also returns the number of elements removed. You can alter the function to create all the elements removed if you wish. This can then be used in a recursive search to reduce search surface space.
// create array from sentence
string[] strArray = "My Name is Yang Yu and I'm the best!".Split(' ');
int RemoveCount = Ordering.RemoveAll<string>(ref strArray, new Predicate<string>(
delegate(string element)
{
// remove all elements with ' in them
return element.Contains("'");
}
));
You may also want to create an InsertAt<T>, or Merge<T>, etc.
The functionalities provided here do not replace the ones in the wrapper class List<T> which does contain most of these methods. Determining when to use Array and when to use List depends on a number of variables. Beware...
| You must Sign In to use this message board. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads.
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 10 Apr 2008 Editor: Deeksha Shenoy |
Copyright 2008 by Yang Yu Everything else Copyright © CodeProject, 1999-2010 Web19 | Advertise on the Code Project |