Может уже не актуально, но вот удаление одинакових сток из массива обектов:
class Program
{
class compare
{
public static bool NumbCompare(object n1, object n2)//метод для порівняння чисел
{
int N1 = (Int32)n1;
int N2 = (Int32)n2;
return N1 != N2 ? true : false;
}
public static bool StrCompare(object n1, object n2)// метод для порівняння стрінгів
{
string str1 = (string)n1;
string str2 = (string)n2;
return str1 != str2 ? true : false;
}
}
// оголошуємо делегат для методу порівняння щоб передавати у ньому як параметр метод порівняння елементів масиву.
// функція, адреса якої буде передаватись у змінній-делегаті повинна повертати змінну типу bool і мати два параметри типу object.
public delegate bool DelegatToCompare(object n1, object n2);
// RowsDel - метод для вилучення однакових рядків із двовимірного масиву об'єктів довільного типу
// Параметри: n - кількість рядків, m - кількість стовпців, myObjects - двовимірний масив об'єктів, cmp - змінна типу делегат, яка задає метод для порівняння
// елементів масиву myObjects.
public static void RowsDel( ref object [,] myObjects,DelegatToCompare cmp )
{
int n; int m; // Поля для розмірностей масиву. n - кількість рядків, m - кількість стовпців
n = myObjects.GetUpperBound(0) + 1; // Вибираємо розмірності масиву у змінні n i m.
if (n < 2) return; // Якщо немаэ хоча б двоъ рядків, то нічого робити
m = myObjects.GetUpperBound(1) + 1;
int dimmyObjectsNew = 0;// кількість рядків масиву після вилучення однакових рядків
bool kliych ;
object[,] myObjNew;// оголошуємо масив для формування масиву - результату
myObjNew = new object[n, m];// створюємо місце для масиву після вилучення
for (int i = 0; i < n; i++)
{
kliych = true; //оголошуємо ключ true для кожного рядка у масиві
for (int ii = 0; ii < dimmyObjectsNew; ii = ii + 1) //цикл по рядках у новому масиві, який буде після вилучення
{
kliych = false;//вважаємо, що відповідні елементи у рядках співпадають
for (int jj = 0; jj < m; jj++) //цикл по стовпцях у новому масиві
{
object n1=myObjects[i, jj];
object n2 = myObjNew[ii, jj];
if (cmp(n1,n2)==true) //якщо елементи рівні, то встановлюємо значення клцюча у true
{
kliych = true;
break; // і виходимо з циклу по стовпцях.
}
}
if (!kliych) // якщо рядки співпадають, то переписувати не треба
{
break;
}
}
if (kliych) //якщо такого рядка нема у новому масиві
{
for (int j = 0; j < m; j++)
{
myObjNew[dimmyObjectsNew, j] = myObjects[i, j]; // то переписуємо цей рядок у масив - результат
}
dimmyObjectsNew = dimmyObjectsNew + 1; //і збільшуємо число кількості рядків у масиві - результаті
}
}
object[,] C = new object[dimmyObjectsNew, m]; //створюємо иасив object-ів з новою розмірністю
for (int i = 0; i < dimmyObjectsNew; i++)
{
for (int j = 0; j < m; j++)
{
C[i, j] = myObjNew[i, j]; //заповнюємо його елементами масиву - результату
}
}
myObjects = C; // присвоюємо початковому масиву значення масиву із зміненою розмірністю
}
static void Main(string[] args)
{
// Це приклад для тестування функції вилучення однакових рядків із двовимірного масиву
const int m=3;
const int n=5; //вказуємо розмірність масиву, з яким будемо працювати
Console.WriteLine("Enter N to work with numbers and S to work with strings:");
string input = Console.ReadLine(); //вводимо з клавіатури вибір тип елементів нашого масиву
// якщо будемо працювати з числами або S, якщо будемо працювати із словами
if (input == "N") // Далі тестуємо вилучення рядків із масиву цілих чисел
{
int[,] myInt = new int[n, m]; // Будемо вводити числа у масив myint
for (int i = 0; i < n; i++)
{
Console.WriteLine("Введіть, будь-ласка, три числа:");
for (int j = 0; j < m; j++)
{
myInt[i, j] = Convert.ToInt32(Console.ReadLine());//вводимо елементи вихідного масиву
}
Console.ReadKey();
}
DelegatToCompare delNumb = new DelegatToCompare(compare.NumbCompare);//створюємо екземпляр делегата для порівняння
object[,] D = new object[n, m];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
D[i, j] = (object)myInt[i, j]; // Запакуємо int y object
}
}
RowsDel(ref D , delNumb); //викликаємо метод для вилучення однакових рядків
// Розпаковуємо
int d1, d2;
d1 = D.GetUpperBound(0);
d2 = D.GetUpperBound(1); //витягуємо розмірності результуючого масиву
int[,] intResultat = new int[d1+1, d2+1];
for (int i = 0; i < d1+1; i++)
{
for (int j = 0; j < d2+1; j++)
intResultat[i, j] = (int)D[i, j];
}
myInt = intResultat; //записуємо результат у початковий масив
}
else
{
string[,] myStr = new string[n, m];
string[,] myStrNew = new string[n, m];
for (int i = 0; i < n; i++)
{
Console.WriteLine("Введіть, будь-ласка, три слова :");
for (int j = 0; j < m; j++)
{
myStr[i, j] = Console.ReadLine();
}
Console.ReadKey();
}
object[,] StrObj = new object[n, m]; // Запакуємо int y object
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
StrObj[i, j] = (object)myStr[i, j];
}
}
DelegatToCompare delStr = new DelegatToCompare(compare.StrCompare);
RowsDel(ref StrObj, delStr);
int d1, d2;
d1 = StrObj.GetUpperBound(0);
d2 = StrObj.GetUpperBound(1);
string[,] strResultat = new string[d1 + 1, d2 + 1];
for (int i = 0; i < d1 + 1; i++)
{
for (int j = 0; j < d2 + 1; j++)
strResultat[i, j] = (string)StrObj[i, j];
}
myStr = strResultat;
}
}
}