arralist i textBox

0

hej mam arrayList "al" i teraz chce aby w pierwzej kolumnie dataGridu znalazał mi liczbę którą wpisuje w textBox1.

            for (int i = 0; i < al.Count; i++)
            {
                if (al[i].Equals(textBox1.Text))
                {
                    //String cache = textBox1.Text;
                    textBox2.Text = "liczba znajduje się w pamięci cache";
                }
                else
                    textBox2.Text = "liczby nie ma w pamięci cache";

proba była równiez z funkcja bool contains(object) jednak i ona nie przyniosla efektu
dziekuje za pomoc

0

Może raczej if(al[i].ToString() == textBox1.Text) ?
To nie jakaś java, żeby trzeba było Equals używać, IMHO wystarczy skonwertować object na stringa.

0

A w jakiej wersji frameworka piszesz ? Od .NET 2.0 są kontenery typowane.

0

w program files\microsoft.NET\SDK\Compact Framewrok mam v2.0 i v3.5

mozna jakąś lepsza kolekcje zastosowac do łaczenia z gridView?

dzieki:)

0

Hm. Choć .NET to nie Java, Equals() i == potrafią się zachowywać odmiennie. W kontekście podanego kodu:

if (al[i] == textBox1.Text)
{
    // Nie wykona się, bo przy kompilacji dopasowany zostanie operator Object == Object, który porównuje referencje
}

if (al[i].Equals(textBox1.Text))
{
    // Wykona się, bo wirtualna metoda Object.Equals jest overridowana na Stringu i w runtimie wykona się porównywanie po wartości
}

if ((string)a[i] == textBox1.Text)
{
    // Wykona się (zgodnie z intuicją wywoła się String.Equals())
}

Czyli z tego wynika, że w podanym na początku wątku kodzie porównanie powinno się powieść. Sprawdź czy ArrayLista na pewno zawiera tą wartość (było jakieś nawiązanie do grida, może nie jest poprawnie zbindowany?).

Natomiast na pewno zamiast ArrayList lepiej używać (w .NET 2.0 +) wspomnianych wyżej generycznych kontenerów, np. List<string>. Dzięki temu obiekty wpisywane/odczytywane z listy są silnie typowane jako stringi, nie jest więc konieczne rzutowanie z object.

0

Mam osobny plik Class1 i tam jest zdefiniowany konstruktor

public Class1(double d, double d1)
            {
                num = d;
                num1 = d1;
            }

nastepnie wypelniam pierwsza kolumne i druga dataGrida

private void Form1_Load(object sender, EventArgs e)
        {
            Random r = new Random();
            for (int i = 0; i < 50; i++)
            {
                //al.Add(new Class1(r.Next(1, 50),i));
                al.Add(r.Next(1,50));
            }

            dataGridView1.DataSource = al;
 }

no i teraz chce porównać wartosc z pola textBox czyli string i wartosc ArrayList czy typ Class1 i teraz nie weim czyw takim przypadku mozna tak rzutowac ale chyba nie bo nic nie wyswietla mi w polu textBox2

 for (int i = 0; i < al.Count; i++)
            {
               
                if (al[i].ToString() == textBox1.Text)

                    textBox2.Text = "znajduje sie w komorce pierwszej";
                else
                    textBox2.Text = "nie znajduej sie w komorce pierwszej";
0

Załóżmy że klasa jest zaimplementowana w poniższy sposób:

        public class Class : IEquatable<String>
        {
            private double _d;
            private double _dl;

            public Class(double d, double dl)
            {
                _d = d;
                _dl = dl;
            }

            public bool Equals(string other)
            {
                if (String.IsNullOrEmpty(other) || String.IsNullOrEmpty(other = other.Trim()))
                    return false;
                double val = 0;
                if (Double.TryParse(other, out val))
                {
                    return val.Equals(_d);
                }
                return false;
            }
        }

Zobacz jak zaimplementowana została metoda Equals. Przykład użycia:

            List<Class> list = new List<Class>();            
            //...........
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i].Equals(richTextBox.Text.Trim()))
                {
                    richTextBox.Text = "Znalazłem";
                }
            }
0

Załóżmy że klasa jest zaimplementowana w poniższy sposób:
public class Class : IEquatable<String>
{
private double _d;
private double _dl;

        public Class(double d, double dl)
        {
            _d = d;
            _dl = dl;
        }

        public bool Equals(string other)
        {
            if (String.IsNullOrEmpty(other) || String.IsNullOrEmpty(other = other.Trim()))
                return false;
            double val = 0;
            if (Double.TryParse(other, out val))
            {
                return val.Equals(_d);
            }
            return false;
        }
    }

Jeśli chodzi nam o liczby to działajmy na liczbach, przechowujmy liczby, porównujmy liczby ! Taka metoda Equals nie pasuje tutaj, jest nieuniwersalna, ogranicza funkcjonalność do łańcuchów, wskazuje na to że obiekt tej klasy jest tożsamy ze łańcuchem, a łańcuch string z tą klasą przecież nie ma nic wspólnego.

Najpierw powinno być pobranie tekstu z textBox1 i konwersja na liczbę i dopiero wyszukiwanie.

0
adf88 napisał(a)

Jeśli chodzi nam o liczby to działajmy na liczbach, przechowujmy liczby, porównujmy liczby !

Tak, zgadzam się, ale to nie jest klasa int lub double - tylko nowy typ, i mogę tak zrobić, jeśli mam zdefiniowane porównanie napisów i obiektów danego typu.

adf88 napisał(a)

Taka metoda Equals nie pasuje tutaj, jest nieuniwersalna, ogranicza funkcjonalność do łańcuchów, wskazuje na to że obiekt tej klasy jest tożsamy ze łańcuchem, a łańcuch string z tą klasą przecież nie ma nic wspólnego.

Niczego to nie ogranicza. Masz przecież metodę bool Equals(Object obj), w której możesz porównywać wszystko ;). Co w tym złego że zdefiniowałem sobie takie porównanie? Dodałem jeszcze jedną metodę, która specjalizuje się w porównywaniu napisów oraz obiektów tego typu i tyle. Nie ma co się burzyć. Są różne podejścia do tematu, i każdy twierdzi że jego rozwiązanie jest słuszne. ;)

0

Jeśli byłaby to klasa do przechowywania tylko tej jednej liczby to by było ok. Ale ta liczba jest tylko kluczem, identyfikatorem obiektu czy tam jednym z pól.

Chodzi o to, że metoda Equals oznacza "przyrównaj obiekt do innego obiektu". A ty przyrównałeś tylko część tego obiektu (dokładnie tylko jedno pole, a może być ich dużo więcej, autor nie pokazał, ale są przynajmniej 2).

@miss: jak byś opisał/a co tam ma się konkretnie znaleźć, co oznaczać i jak działać, a nie że to tylko jakieś tam losowe num, num1 to można by więcej powiedzieć bo rozwiązań jest dużo, a na razie po części gdybamy (stąd pewnie rozbieżności).

0

widze ze wymieniacie zdania miedzy sobą:P

kokretnie to chciałabym zrobic cos takiego. Zaciełam sie własnie na etapie tego porównywania wartości wpisanej w polu textBox i ArrayList połączonego z dataGrid

http://wislawielka.pl/jezyki/

0

Zamiast ArrayList użyj List<Class1>. Przed wyszukiwaniem zamień tekst z textBox1 na liczbę i wyszukuj tą liczbę.

0

mam coś takiego. tylko jest problem zawsze wyskakuje mi "nie ma"

double liczba = Convert.ToDouble(textBox1.Text);
            for (int i = 0; i < al.Count; i++)
            {

                if (al[i].Cache.Equals(liczba))
                {
                    textBox2.Text = "jest";
                }
            else
               {
                    textBox2.Text = "nie ma";
               }
0

Może Cache zwraca nie to co powinno ?

Po co Equals ? Użyj normalnie opweratora porównania (==).

Zamiast Convert.ToDouble użyj Double.TryParse bo taka konwersja nie zawsze jest wykonywalna (jeśli nie wpiszemy liczby program się wysypie).

Wklej cały kod tutaj: http://pastebin.4programmers.net i daj linka do niego.

0

.Cache tez jest typu double?
musisz uzywac zmiennoprzecinkocow? jak nie to uzyj int'a. jak tak - decimal'a. moze masz pecha i natrafilas na blad zaokraglen i 1.5 != 1.5 bo to drugie okazuje sie byc 1.50000000001

poza tym.. przejrzalem caly watek i szczerze, do tej pory nie wiem co Ty masz am u sibie w kodzie.. jesli kod tej formatki jest znosnejdlugosci, wklej caly.. albo na pastebin'a..

//edit: heh, za wolno pisalem:)

0

kod form1.cs

using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Sztuczna_inteligencja
{
    public partial class Form1 : Form
    {
         //private ArrayList al = new ArrayList();
         //private ArrayList all = new ArrayList();
         private List<Class1> al = new List<Class1>();
        // private List<Class1> all = new List<Class1>();
        private CurrencyManager currencyManager = null;

        public Form1()
        {
            
            InitializeComponent();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Random r = new Random();
            for (int i = 0; i < 50; i++)
            {
              

               //dataGridView1.Rows[i].Cells[0] = al;
                al.Add(new Class1(r.Next(1,50),i));

                  
            }
           
           currencyManager = (CurrencyManager)dataGridView1.BindingContext[al];


           dataGridView1.DataSource = al;
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double a;
            bool liczba = Double.TryParse(textBox1.Text, out a);
            for (int i = 0; i < al.Count; i++)
            {

                if (al[i].Cache.Equals(liczba))
                {
                    textBox2.Text = "jest";
                }
              else
                    textBox2.Text = "nie ma";

            currencyManager.Position = 0;
        }

kod Class1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sztuczna_inteligencja
{
    public class Class1 : IEquatable<String>
    {
        private double _d;
        private double _dl;
        
     

            // Constructor
            public Class1(double d, double dl)
            {
                _d = d;
                _dl = dl;
            }
           
        
            public double Cache
            {
                get { return _d; }
                set { _d = value; }
            }
           public double RAM
            {
                get { return _dl; }
                set { _dl = value; }
            }
          
              
           }
            
    }
0

double a;
bool liczba = Double.TryParse(textBox1.Text, out a);

//...

Cache.Equals(liczba)
uh, porównujesz nie to co trzeba

http://msdn.microsoft.com/en-us/library/994c0zb1.aspx

0

dzieki juz wiem dobrze mi liczy super!!!!!!!!! dzięki

teraz mam pytanie... małą podpowiedź jak zrobic zeby tą liczbe którą teraz pobiorę z pamięci RAM zapisać na końcu listy i jednoczenie usuwając pozycje znajdująca sie najwyżej

pewnie odpowiednią funkcje do listy trzeba zastosować.....

dzieki

0

Hmm, opisz dokładniej bo nie rozumiem. Również opis na rysunku jest niezrozumiały.

Pisząc Cache i RAM masz na myśli pierwszą i drugą kolumnę ? Czy RAM to coś innego jeszcze ?

0

Mi to wygląda, jakby autor chciał użyć kolejki (Queue) - dodać coś na końcu i usunąć coś z początku.

0

a mi to wyglada, ze ten program ma symulowac dzialanie cache'a procesora...

0

tak zgadza sie ma symulowac dzialanie cache procesora:)

cache i RAM to pierwsza i druga kolumna

czyli mam wyszukiwac metod listy czy nie tędy droga.........

dzieki

0

No dobra, pierwsza kolumna to zawartość cache, druga to adres tej zawartości w RAM, a gdzie zawartość RAM ?
I teraz żądamy komórki X pamięci więc jak jej nie ma w cache to trzeba załadować tak ?
Czy dalej czegoś nie rozumiem ?

I zmień double na int.

0

miss/majka - chodzilo Ci o takie zachowanie?

        private void button1_Click(object sender, EventArgs e)
        {
            double wpisanaWartosc;
            bool prawidlowaLiczba = Double.TryParse(textBox1.Text, out wpisanaWartosc);
            if (!prawidlowaLiczba) return;

            int i = 0;
            for ( ; i < al.Count; i++) //przegladanie listy czy jest taka wartosc
                if (al[i].Cache == wpisanaWartosc)
                    break; //jak zostanie znaleziona - koniec przegladania

            if(i < al.Count) // jesli wyszukiwanie zatrzymalo sie przed dotarciem na sam koniec
                    textBox2.Text = "jest";
            else
                textBox2.Text = "nie";

            Class1 element_i_ty = al[i]; //zapamietac znaleziatko
            al.RemoveAt(i); //wywalic element znaleziony
            al.Add(element_i_ty); //wstawic go z powrotem - na koniec
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1