Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
m0nax
1203 / 908 / 109
Регистрация: 12.01.2010
Сообщений: 1,891
Завершенные тесты: 3
#1

Поиск в списке массивов (List<byte[]>)

02.03.2010, 18:13. Просмотров 7222. Ответов 7
Метки нет (Все метки)

собственно в чем ошибка
(Encoding роли не играет, он тут для читабельности)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
           List<byte[]> btList = new List<byte[]>();
 
    btList.Add(Encoding.ASCII.GetBytes("1111"));
    btList.Add(Encoding.ASCII.GetBytes("23123"));
    btList.Add(Encoding.ASCII.GetBytes("3123123"));
           btList.Add(Encoding.ASCII.GetBytes("1111"));
 
    byte[] test = Encoding.ASCII.GetBytes("1111");
 
    if (btList.Contains(test))
    {
 //до этого не доходит - в списке якобы нету такого элемента
//кто виноват и что делать
        Console.WriteLine("есть такой");
    }
ну и в догонку, расскажите как и зачем пользоваться методами серии Find***
C#
1
2
3
4
5
6
7
8
9
10
btList.FindIndex(new Predicate<byte[]>(FindFunc) 
.....
static bool FindFunc(byte[] obj)
{
    // получается что искомый объект должен быть объявлен глобально, что бы  с ним сравнивать?
    // какой тогда смысл всего этого если искать приходится вручную ? 
    // проще же просто в цикле перебрать список без всяких делегатов, предикатов, функций и глобальных объектов о_О
 
    return true;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2010, 18:13
Ответы с готовыми решениями:

Ошибка. не получается устранить(list = List<byte>)
Вот накатал, но есть ошибки, никак не получается устранить(list = List&lt;byte&gt;):...

Объединение нескольких массивов byte[]
Доброго времени суток. Есть коллекция: SortedList&lt;int, byte&gt; dict = new...

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода
есть COM интерфейс с методом: virtual /* */ HRESULT STDMETHODCALLTYPE...

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?
Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной...

Пердача byte[] COM-функции, ожидающей ref byte
Привет, наше приложение в C# использует несколько COM-интерфейсов. В одном...

7
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
02.03.2010, 18:31 #2
в первом случае не находит, потому что идет проверка равенства ссылки на объект, а вот новоиспеченный byte[] test = Encoding.ASCII.GetBytes("1111") мягко говоря не есть то, что было добавлено первой строкой. Find - выход из сложившейся ситуации - тут в предикате можно явно указать по каким критериям производится поиск. сам метод вернет сущность, а, следовательно, если null , то не содержит, иначе - содержит

C#
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
29
30
31
32
using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication14 {
    class Program {
        static void Main(string[] args) {
            List<byte[]> btList = new List<byte[]>();
 
            btList.Add(Encoding.ASCII.GetBytes("1111"));
            btList.Add(Encoding.ASCII.GetBytes("23123"));
            btList.Add(Encoding.ASCII.GetBytes("3123123"));
 
            byte[] test = Encoding.ASCII.GetBytes("1111");
 
            byte[] found = btList.Find((byte[] bt) => {
                // проверка на длину массива
                if (bt.Length != test.Length) return false;
                // побайтовая проверка
                for (int i = 0; i < bt.Length; i++)
                    // тут равенство работает, так как байт - значимый тип
                    if (bt[i] != test[i])
                        return false;
                // все проверки пройдены
                return true;
            });
 
            Console.WriteLine(found == null ? "Не найдено" : "Найдено");
            Console.ReadKey();
        }
    }
}
если => не понятно - то это лямбда-выражение. http://www.cyberforum.ru/csharp-net/...tml#post543812 - в этом моем посте все описано
2
Fanat_
12 / 12 / 3
Регистрация: 21.11.2008
Сообщений: 41
02.03.2010, 20:30 #3
Вот ещё 2 способа решения проблемы =)
C#
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 static void Main(string[] args)
        {
            List<byte[]> btList = new List<byte[]>();
 
            btList.Add(Encoding.ASCII.GetBytes("1111"));
            btList.Add(Encoding.ASCII.GetBytes("23123"));
            btList.Add(Encoding.ASCII.GetBytes("3123123"));
            btList.Add(Encoding.ASCII.GetBytes("11112"));
 
            byte[] test = Encoding.ASCII.GetBytes("1111");
            
 
            //comparer c = new comparer();
            //if (btList.Contains<byte[]>(test,c ))
            if( btList.Exists((byte[] i) => i.SequenceEqual(test)))
            {
                Console.WriteLine("есть такой");
            }
 
            Console.ReadKey();
        }
 
        class comparer : IEqualityComparer<byte[]>
        {
            public bool Equals(byte[] x, byte[] y)
            {
                if (x.Length != y.Length)
                    return false;
 
                for (int i = 0; i < x.Length; i++)
                {
                    if (x[i] != y[i])
                        return false;
                }
 
                return true;
            }
 
            public int GetHashCode(byte[] obj)
            {
                throw new NotImplementedException();
            }
        }
0
SSV
Заблокирован
02.03.2010, 21:33 #4
Чудеса какие-то! Кто объяснит почему не работает?
Ставлю точки останова - все ОК, но не работает.

C#
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
static void Main(string[] args)
        {
            List<byte[]> btList = new List<byte[]>();
 
            btList.Add(Encoding.ASCII.GetBytes("1111"));
            btList.Add(Encoding.ASCII.GetBytes("23123"));
            btList.Add(Encoding.ASCII.GetBytes("3123123"));
            btList.Add(Encoding.ASCII.GetBytes("222"));
 
            byte[] test = Encoding.ASCII.GetBytes("222");
 
            //так не работает
            foreach(byte[]b in btList)
            {
                if (b == test) 
                    Console.WriteLine("есть такой");
            }
 
            //и так тоже
           if (btList.Contains(test))
            {
                Console.WriteLine("есть такой");
            }
            else Console.WriteLine("Нет");
       
            Console.ReadKey();
        }
Кстати, Fanat ,твой способ тоже не работает.
0
m0nax
1203 / 908 / 109
Регистрация: 12.01.2010
Сообщений: 1,891
Завершенные тесты: 3
02.03.2010, 23:32  [ТС] #5
ssv_www, дык Mikant уже объяснил, это же ссылки, а не сами данные

не знаю как в шарпе это устроено, но в С++ и С имя массива это указатель на начало блока памяти, т.е адрес памяти типа F7AD1130
а поскольку массивы в разных местах естественно их ссылки(адреса) не совпадают, поэтому приходится поэлементно их сравнивать

з.ы. лямбды и анонимные методы это конечно хорошие штуки, сразу не все вопросы ответ
1
SSV
Заблокирован
03.03.2010, 00:05 #6
ОК. Разобрался
C#
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
29
30
31
class Program
    {
        static void Main(string[] args)
        {
            List<byte[]> btList = new List<byte[]>();
 
            btList.Add(Encoding.ASCII.GetBytes("1111"));
            btList.Add(Encoding.ASCII.GetBytes("23123"));
            btList.Add(Encoding.ASCII.GetBytes("3123123"));
            btList.Add(Encoding.ASCII.GetBytes("222"));
 
            byte[] test = Encoding.ASCII.GetBytes("222");
            bool bo = false;
            foreach(byte[] b in btList)
            {
               
                if (b.Length == test.Length)
                {
                     bo = true;
                    for (int i = 0; i < b.Length; ++i)
                    {
                        if (b[i] != test[i]) bo = false;
                    }
                    if(bo) Console.WriteLine("есть такой");
                    else Console.WriteLine("Нет");
                }
            }
 
                 
            Console.ReadKey();
        }
0
Fanat_
12 / 12 / 3
Регистрация: 21.11.2008
Сообщений: 41
03.03.2010, 07:31 #7
Кстати, Fanat ,твой способ тоже не работает.
Кстати, работает.
0
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
03.03.2010, 11:48 #8
Цитата Сообщение от m0nax Посмотреть сообщение
з.ы. лямбды и анонимные методы это конечно хорошие штуки, сразу не все вопросы ответ
- никто не запрещает пользоваться обычным способом : отдельно объявить предикат
0
03.03.2010, 11:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2010, 11:48

Поиск в List
Доброго времени суток дорогие форумчане! Имеется List data1 с датами...

Поиск в List<MyClass>
Здравствуйте у меня такой вопрос я создал класс с тремя полями данных разного...

wav byte[] в flac byte[]
Ситуация такая: С микрофона каждую 0.1 сек идет byte где то по 3к значений....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru