Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
1

В случае передачи строки, метод выдаёт true, а в случае передачи значения типа int - false

13.08.2014, 17:50. Показов 2324. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Почему в случае передачи строки, ниже приведённый метод выдаёт true, а в случае передачи значения типа int - false?

C#
1
2
3
4
    public bool Contains(object value)  {
        for (int i = 0; i < Count; i++) { if (_contents[i] == value) { return true; } }
        return false;
    }
При _contents[0]="qwerty"; вызов Contains("qwerty") возвращает true
При _contents[0]=1; вызов Contains(1) возвращает false

Где собака зарыта?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2014, 17:50
Ответы с готовыми решениями:

ISNUMBER работает в случае True, возвращает #ЗНАЧ! в случае False
У меня есть колонка со строками, в функции я проверяю, есть ли определенная подстрока в той или...

Описать функцию IsLeapYear(Y) логического типа, которая возвращает True, если год являеятся високосным, и False в противном случае
Описать функцию IsLeapYear(Y) логического типа, которая возвращает True, если год Y (целое...

Как описать функцию Even(K) логического типа, возвращающую TRUE, если целый параметр K является четным, и FALSE в противном случае
Помогите пожалуйста решить задачу, очень срочно надо. Proc24. Описать функцию Even(K) логического...

Создать функцию Chet(k) логического типа,возвращающую True , если целый параметр К является чётным и False в противном случае
Создать функцию Chet(k) логического типа,возвращающую True , если целый параметр К является чётным...

30
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
13.08.2014, 17:56 2
Mr Di, я так понимаю, _contents у вас массив объектов типа object?
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
13.08.2014, 17:59  [ТС] 3
Да, верно, объявлен как:
C#
1
 private object[] _contents = new object[0];
Далее размер массива увеличивается по мере необходимости.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
13.08.2014, 18:11 4
Mr Di, ятд что в первом случае сравниваются сами строки. А вот во втором (поскольку object ссылочный тип) сравниваются ссылки. value у вас тоже типа object, так? Выполните явное приведение к нужному типу и будет нормально.
Вот как-то так...
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace AAA
{
    class Program
    {
        public static void Main(string[] args)
        {
            // TODO: Implement Functionality Here
            object[] objs={"qwerty", 1};
            object strObj="qwerty";
            object intObj=1;
            
            Console.WriteLine(objs[0]==strObj);
            Console.WriteLine(objs[1]==intObj);
            Console.WriteLine((int)objs[1]==(int)intObj);
            
            Console.ReadLine();
        }
    }
}
1
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
13.08.2014, 18:19  [ТС] 5
А есть ли какой либо "универсальный" метод преобразования типов?
Ведь в приведённом выше методе могут сравниваться данные различных типов...
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
13.08.2014, 18:27 6
Цитата Сообщение от Mr Di Посмотреть сообщение
какой либо "универсальный" метод преобразования типов?
Это вряд ли...
1
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
13.08.2014, 18:37 7
Лучший ответ Сообщение было отмечено Mr Di как решение

Решение

Mr Di, до тех пор пока имеем дело с типами-значениями и string такое будет работать:
C#
1
if (_contents[i].Equals(value)) { return true; }
1
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
13.08.2014, 19:09  [ТС] 8
Learx, спасибо огромное! Это то что нужно.
0
rattrapper
13.08.2014, 20:19
  #9

Не по теме:

Mr Di, так, на будущее: boxing (использование object) - плохая практика в программировании, тем более, что 99% задач можно решить другим способом.

0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
13.08.2014, 20:41  [ТС] 10
rattrapper, я не имею большого опыта в написании именно на C# и был бы признателен за совет. Задача стояла такая: Необходим класс, реализующий функциональность динамического массива данных( либо чисел, либо строк, либо динамических массивов), имеющих целочисленный ID (номер).
Я решил реализовать как класс, имеющий интерфейс IList. Вот как-то так:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
class clsSimpleList : IList
{
    private object[] _contents = new object[0];
    private int _count;
 
    public clsSimpleList() { _count = 0; }
 
    public int Add(object value)
    {
 
      for (int i = 0; i < _contents.Length; i++) {
        if ((_contents[i] != null) && (value.ToString() == _contents[i].ToString())) return (_count - 1);
      }
      if (_count >= _contents.Length)
      { 
        object[] _tmp = new object[_count];
        _contents.CopyTo(_tmp, 0);
        _contents = new object[(int)(_count * 1.0) + 1];
        _tmp.CopyTo(_contents, 0);
        _tmp = new object[0];
      }
      _contents[_count] = value;
      _count++;
      return (_count - 1);
    }
 
    public void Clear()
    {
        _count = 0;
        _contents = new object[0];
    }
 
    public bool Contains(object value)
    {
      for (int i = 0; i < Count; i++) { if (_contents[i].Equals(value)) { return true; } }
      return false;
    }
    public int IndexOf(object value)
    {
      for (int i = 0; i < Count; i++) { if (_contents[i].Equals(value)) { return i; } }
      return -1;
    }
 
    public void Insert(int index, object value)
    {
        if ((_count + 1 <= _contents.Length) && (index < Count) && (index >= 0))
        {
            _count++;
            for (int i = Count - 1; i > index; i--) { _contents[i] = _contents[i - 1]; }
            _contents[index] = value;
        }
    }
 
    public bool IsFixedSize { get { return true; } }
 
    public bool IsReadOnly { get { return false; } }
 
    public void Remove(object value) { RemoveAt(IndexOf(value)); }
 
    public void RemoveAt(int index)
    {
        if ((index >= 0) && (index < Count))
        {
            for (int i = index; i < Count - 1; i++) { _contents[i] = _contents[i + 1]; }
            _count--;
        }
    }
 
    public object this[int index] {
        get { return  _contents[index]; }
        set { _contents[index] = value; }
    }
 
    public void CopyTo(Array array, int index)
    {
        int j = index;
        for (int i = 0; i < Count; i++) {
            array.SetValue(_contents[i], j);
            j++;
        }
    }
 
    public int Count { get { return _count; } }
 
    public bool IsSynchronized { get { return false; } }
    public object SyncRoot { get { return this; } }
 
    IEnumerator IEnumerable.GetEnumerator()
    {
      return (IEnumerator)GetEnumerator();
    }
    public SimpleListEnum GetEnumerator()
    {
      return new SimpleListEnum(_contents);
    }
 
/*
    public IEnumerator GetEnumerator() { return (IEnumerator)this; }
  */
    public void PrintContents() { 
      for (int i = 0; i < Count; i++) { Console.Write(" {0}", _contents[i]); }
      Console.WriteLine();
    }
  }
Буду рад любым замечаниям.
0
foo();
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
13.08.2014, 23:08 11
Mr Di, ну не знаю, посмотрите на это:
белиберда
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
static class Program
{
    private static void Main(string[] args)
    {
        var list = new MyList();
        StringValue s = "hello";
        ListValue<int> testList = new List<int> {1, 2, 3, 4};
        list.Add(s);
        list.Add(testList);
        Console.WriteLine(list[0]);
        Console.WriteLine(((ListValue<int>) list[1]).Sum());
        Console.ReadKey();
    }
}
 
abstract class Value
{ }
 
class StringValue : Value
{
    public string Value { get; private set; }
 
    public StringValue(string value)
    {
        Value = value;
    }
 
    public override string ToString()
    {
        return Value;
    }
 
    public static implicit operator StringValue(string s)
    {
        return new StringValue(s);
    }
}
class ListValue<T> : Value, IEnumerable<T>
{
    public List<T> Value { get; private set; }
 
    public ListValue(List<T> value)
    {
        Value = value;
    }
 
    public static implicit operator ListValue<T>(List<T> l)
    {
        return new ListValue<T>(l);
    }
 
    public IEnumerator<T> GetEnumerator()
    {
        return Value.GetEnumerator();
    }
 
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
sealed class MyList : List<Value>
{
    public new void Add(Value val)
    {
        if (!Contains(val))
            base.Add(val);
    }
 
    public void PrintContents()
    {
        for (int i = 0; i < Count; i++)
        {
            Console.Write(" {0}", this[i]);
        }
        Console.WriteLine();
    }
}


Добавлено через 1 минуту
Цитата Сообщение от Mr Di Посмотреть сообщение
Необходим класс, реализующий функциональность динамического массива данных( либо чисел, либо строк, либо динамических массивов)
вы уверены, что это обязательно?
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
14.08.2014, 10:15  [ТС] 12
rattrapper, честно скажу - не всё понял...
Не зациклен ли этот метод на себя?
C#
1
2
3
public static implicit operator ListValue<T>(List<T> l)
    {
        return new ListValue<T>(l);
}
Как проверять массив на присутствие элемента? В массив должны добавляться данные различных типов, но это-то можно развести...
Возможно ли добавление элемента типа массив? Как это объявить?

C#
1
 ListValue<ListValue<string>> testList = new List<ListValue<string>> [0];
0
foo();
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
14.08.2014, 10:23 13
Цитата Сообщение от Mr Di Посмотреть сообщение
Не зациклен ли этот метод на себя?
нет
Цитата Сообщение от Mr Di Посмотреть сообщение
Возможно ли добавление элемента типа массив? Как это объявить?
для каждого типа придется создавать класс-заглушку (наследник Value). Так мы хотя бы убедимся, что в нашу коллекцию добавляются элементы только нужных нам типов.
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
14.08.2014, 10:30  [ТС] 14
для каждого типа придется создавать класс-заглушку (наследник Value). Так мы хотя бы убедимся, что в нашу коллекцию добавляются элементы только нужных нам типов.
Мне кажется в данном случае у меня проще получилось. И при этом, задача решена.

И самое главное, я предварительно не могу знать какого типа будут добавляться данные в массив, поэтому невозможно зарание объявить его какого-либо типа...
0
foo();
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
14.08.2014, 10:34 15
Цитата Сообщение от Mr Di Посмотреть сообщение
я предварительно не могу знать какого типа будут добавляться данные в массив
Тогда как Вы с этими данными будете работать??? Но я согласен с фактом, что мой вариант кривоват. Просто не представляю зачем нужно смешивать объекты разных типов в одной коллекции...
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
14.08.2014, 11:00  [ТС] 16
Просто не представляю зачем нужно смешивать объекты разных типов в одной коллекции...
В каждом экземпляре данные одно типа, но я предварительно не знаю что это: строки, числа или даты. Или еще что-либо (данные считываются из столбца БД).
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
14.08.2014, 11:55 17
Mr Di, а для какой цели вообще это создается? неужто нет стандартных инструментов Framework, которые решат поставленную задачу?
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
14.08.2014, 12:40  [ТС] 18
Вообще, универсальные инструменты не оптимальны.
Может я многого еще не знаю именно в C# и .Net Framework, но я много работал с другими технологиями MS.
В данном случае, мне необходим многопользовательский доступ в файлу .mdb (MSAccess). Т.к. при подключении нескольких пользователей к данному типу файлов начинаются "траблы"(т.е. множественные блокировки, тормоза, и отказы) , то для доступа применяется технология "отвязанных данных".
Суть проста:
1-тот объём данных который надо редактировать, по сути мал.
2-обращаемся к соединению с БД -> читаем данные (данные помещаются в одномерный массив + табличные массивы если форма со "спецификацией").
3-помещаем данные в нужную форму -> отдаём пользователю на (просмотр, изменение, удаление и пр.)
4-по результатам посылаем (или не посылаем) запрос в базу.

Вот на 3-м этапе возникает проблема. Постараюсь кратко:
В случае формы со спецификацией нужно обеспечить ввод в поля типа выпадающий список в grid-е (DataGridViewComboBoxColumn). Редактирование в таких полях не поддерживается.
Поэтому для реализации нормального редактирования в таких полях (типа адресно-поисковой строки Хрома) я решил реализовать динамические списки подстановки через динамические массивы. (тот класс что я запостил в сообщ. 10)
Смысл такой:
- считываю в массив весь справочник
- при пользовательском вводе делаю фильтр по началу строки в справочнике и первые, скажем, 15 позиций посещаю в .Items контрола (как подсказку пользователю)
Вот такой смысл.

Еще использую переменную этого же класса для хранения самих массивов справочников.
Вот как-то так.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
14.08.2014, 13:20 19
Mr Di, поверьте, гораздо проще использовать DataTable+OleDbdataAdapter чем городить свой велосипед. чтоб создать работоспособный код вам доведется очень сильно постараться. и вашего уровня знаний тут явно недостаточно.
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 22
14.08.2014, 13:37  [ТС] 20
Learx, у меня уже всё работает

Знаний у меня вагон и три маленькие тележки, просто навыков C# не хватает.
Я использую OleDbCommand для загрузки данных в локальное хранилище. Этого достаточно.
А вот с DataTable, я, к сожалению, не смог воспроизвести работу выпадающих списков.

И !самое главное! нельзя держать постоянное соединение с БД, а списки будут постоянно подчитываться из базы.
0
14.08.2014, 13:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.08.2014, 13:37
Помогаю со студенческими работами здесь

Разработать функцию, которая возвращает True, если полученные значения могут быть сторонами треугольника, False – в противном случае
Разработайте функцию, которая получает три вещественных параметра, возвращает в качестве своего...

Если кнопка зажата то - true в противном случае - false
Пишу приложение на сенсор win7. Пробовал mouseUp, mouseDown; StilusUp StilusDown и т.п. не...

Переменной k логического типа присвоить значение true в том случае, если массив n целых чисел упорядочен по возрастанию, i значение false если нет
Условие задачи: Переменной k логического типа присвоить значение true в том случае, если массив n...

Вернуть true, если параметр является алфавитно-цифровым и false в ином случае
Нужно написать функцию, которая возвращает истину, если переданный параметр является алфавитно -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru