powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сравнение массивов
20 сообщений из 20, страница 1 из 1
Сравнение массивов
    #32859363
Aleksey_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не подскажет ли кто, как сравнить два массива ?
В Java я могу воспользоваться Array.Equals, в Cи есть memcmp. Есть ли что нибудь такое в C# ? (Array.Equals не помогает, судя по всему он сравнивает по ссылке)
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865261
Aleksey_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по всему такой фичи в шарпе нету :(
Чем дальше использую шарп тем больше понимаю, что си\++ и джава более функциональны.
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865394
Aleksey_tСудя по всему такой фичи в шарпе нету :(
Чем дальше использую шарп тем больше понимаю, что си\++ и джава более функциональны.

Есть такая фича - голова на плечах называется. От языка не зависит.

PS: Как вариант реализации сравнения массивов в c#:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
bool CompareStringArray(string[] arr0, string[] arr1)
{
  if ( arr0.Length != arr1.Length ) return false;
  for ( int i = 0; i < arr0.Length; i++)
    if ( arr0[i] != arr1[i]) return false;
  return true;
}

...
Рейтинг: 0 / 0
Сравнение массивов
    #32865415
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, чегой-то не выходит сравнить :(
Но если очень надо, то:


На скорую руку получилось следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class MyArray: System.Collections.ArrayList
	{
		public MyArray()
		{
			
		}
		public bool CompareWithArray(ArrayList b)
		{
			
			if (this.Count == 0 && b.Count==0) return true;
			if (this.Count != b.Count)
			{
				return false;
			}
			else
			{
				for (int i=0; i<this.Count; i++)
				{
					if (this[i].Equals(b[i])==false) return false;
				}
			}
			return true;
		}
	}

Долго не тестил, но вроде работает по крайней мере для простых типов (int, string и тп)

-------------------------------------------------------------------------
Нет худа без добра, да и добро без худа - чудо.
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865586
Aleksey_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы извините, но 10 Мб данных сравнивать через for...if - это круто !!! :)
Спасибо за помощь, но хотелось бы что то поэффективнее.
Мне вот предлагали через MemoryStream реализовать, но оказалось не лучше чем for...if

>Есть такая фича - голова на плечах называется. От языка не зависит.
:)
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865602
Aleksey_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To: M234

>Да, чегой-то не выходит сравнить :(
Сравнить то можно, хотелось бы как можно поэффективнее.
Но все равно спасибо за помощь.
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865680
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Вы извините, но 10 Мб данных сравнивать через for...if - это круто !!! :)
> Спасибо за помощь, но хотелось бы что то поэффективнее.

А для чего, если не секрет, два совершенно одинаковых массива по 10 Мб???
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865685
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey_tВы извините, но 10 Мб данных сравнивать через for...if - это круто !!! :)


И очень быстро !!! :)
К томуже сравнение массивов, тем более разнородных объектов - всегда перебор.
Не вижу другого пути. Ежели кто знает - поделитесь.
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865695
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Вы извините, но 10 Мб данных сравнивать через for...if - это круто !!! :)
> Спасибо за помощь, но хотелось бы что то поэффективнее.

Если массивы так велики, то почему бы не использвать msde?
Скорость сравнения средствами MSSQL с использованием индексов на порядок выше чем в той же джабе.

--
WBR, Roman S. Golubin
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865711
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M234сравнение массивов, тем более разнородных объектов - всегда перебор.
Не вижу другого пути. Ежели кто знает - поделитесь.

Ну, можно хэши целочисленные сравнивать - скорость возрастет в разы... только просто array тогда не подойдет.
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865713
Фотография www.fun4me.narod.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Скорость сравнения средствами MSSQL с использованием индексов на порядок выше чем в той же джабе.

Скорость будет ниже, потому что MSSQL не учитывает порядок элементов в массиве. Здесь сложность o(n). А в MSSQL будет o(n*log(n))
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865745
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
www.fun4me.narod.ru>> Скорость сравнения средствами MSSQL с использованием индексов на порядок выше чем в той же джабе.

Скорость будет ниже, потому что MSSQL не учитывает порядок элементов в массиве. Здесь сложность o(n). А в MSSQL будет o(n*log(n))

Т.е.? Ты считаешь, что простой перебор быстрее сравнения по индексам?

Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
declare @c0 int, @c1 int

select @c0 = count(*) from arr0
select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val)

-- Массивы идентичны, если @c0 = @c1

где FK_arr_val - форент на массив значений (я думаю, несовместимые друг с другом объекты ты сравнивать не собираешься?)
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865751
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
declare @c0 int, @c1 int

select @c0 = count(*) from arr0
select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val)

-- Массивы идентичны, если @c0 = @c1

Да, совсем забыл - первичный ключ тоже надо включить в индекс:

select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val and arr0.PK = arr1.PK)
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865758
Фотография www.fun4me.narod.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Т.е.? Ты считаешь, что простой перебор быстрее сравнения по индексам?

Я считаю, что поиск элемента массива по индексу в массиве будет, при правильной реализации, работать быстрее, чем поиск строки таблицы по индексу. Потому как в первом случае уже известно, где лежит элемент.

Плюс, когда мы делаем

select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val)

Мы должны перебрать все элементы массива arr1 хотя бы один раз. Разве нет?
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865769
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
www.fun4me.narod.ruПлюс, когда мы делаем

select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val)

Мы должны перебрать все элементы массива arr1 хотя бы один раз. Разве нет?

нет. мы должны перебирать индексы. целочисленные. ~ 4 байта на одну запись. А данные по этому индексу могут быть хоть километрового размера - нам безразлично, что они из себя представляют :-)
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865771
Aleksey_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
M234
И очень быстро !!! :)
К томуже сравнение массивов, тем более разнородных объектов - всегда перебор.
Не вижу другого пути. Ежели кто знает - поделитесь.

Даа, я одну деталь упустил (т.к. надеялся что в шарпе есть что то типа джававского Array.Equals). Данные однородные: массив байтов.
И судя по всему другого варианта нет как простой перебор.
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865781
Aleksey_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman S. Golubin
нет. мы должны перебирать индексы. целочисленные. ~ 4 байта на одну запись. А данные по этому индексу могут быть хоть километрового размера - нам безразлично, что они из себя представляют :-)

Хааа, перебирать то мы должны индексы, но ~ 4 байта это ~ ссылка на данные в карте записей, а размер ключа индекса равен размеру полей по которым индекс построен :) Если не верите, почитайте в MSDN, кстати обычные индексы в MS SQL созданы на основе улучшенного B-дерева.
Так что в любом случае мы должны перебрать все элементы массива arr1 хотя бы один раз.
...
Рейтинг: 0 / 0
Сравнение массивов
    #32865961
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey_tХааа, перебирать то мы должны индексы, но ~ 4 байта это ~ ссылка на данные в карте записей, а размер ключа индекса равен размеру полей по которым индекс построен :) Если не верите, почитайте в MSDN, кстати обычные индексы в MS SQL созданы на основе улучшенного B-дерева.
Так что в любом случае мы должны перебрать все элементы массива arr1 хотя бы один раз.

Хмм... я представляю себе табличку (или даже набор табличек), в которых лежат записи о каких-то объектах, и у которой есть сурогатный первичный ключ (4 байта). Массив создается добавлением ссылки на сурогатный ключ в таблички arr0 и arr1. После этого соответствие массивов легко проверяется по индексу, построенному по 4-х байтному полю.

PS: На самом деле, я не могу представить себе задачи, где пришлось бы более бестолково сравнивать два массива по 10 метров. Я еще мог бы понять, если бы было нужно найти, например, с какого места они начинают расходиться. Но просто сравнить??!! - ну, допустим, они не равны - какое знание ты получишь из этого? А если равны, то что тогда?

PSS: Ты так и не сказал, что за данные находятся в этих массивах. Если там отсутствуют хоть какие-то метаданные, то это просто бредовый набор данных. Смысла сравнивать его с чем-либо, имхо, нет ни какого. Если метаданные есть, то это прямой кандидат для создания базы данных, раскладки содержимого по таблицам и сравнения посредством запроса, указанного мною выше.

--
WBR, Roman S. Golubin
...
Рейтинг: 0 / 0
Сравнение массивов
    #32866029
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey_tДаа, я одну деталь упустил (т.к. надеялся что в шарпе есть что то типа джававского Array.Equals). Данные однородные: массив байтов.
И судя по всему другого варианта нет как простой перебор.

Тестим:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
static void Main(string[] args) {

  byte[] arr0 = new byte[10000000];
  byte[] arr1 = new byte[10000000];

  System.Security.Cryptography.RandomNumberGenerator rng = System.Security.Cryptography.RandomNumberGenerator.Create();

  rng.GetBytes(arr0);

  Array.Copy(arr0, arr1, arr0.Length);

  DateTime ds;
  DateTime de;
  TimeSpan ts;

  ds = DateTime.Now;

  int i = 0;
  while(( i < arr0.Length ) && ( arr0[i] == arr1[i] )) i++;
  bool result = (i == arr0.Length);

  de = DateTime.Now;


  ts = de - ds;

  System.Diagnostics.Debug.WriteLine(ts.ToString());

}

Результат: 00:00:00.0801152

Скорость сравнения примерно 120 метров в секунду. Не впечатляет?
И это на смешном ноутбуке... полностью два едентичных массива по 10 метров. Если бы расхождение было в первом мегабайте, то таких проверок можно было бы делать от сто штук в секунду :-))

--
WBR, Roman S. Golubin

PS: А я, думая, что ты сравниваешь сложносоставные объекты, начал еще распинаться про msde :-)
...
Рейтинг: 0 / 0
Сравнение массивов
    #32868810
Aleksey_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роман,
Огромное спасибо за советы.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сравнение массивов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]