Wątek przeniesiony 2014-09-11 18:48 z C# i .NET przez ŁF.

Lista i Distinct - nazwy artykułów powielają się

0

Witam,

Mam pewien problem mam listę List<Artykuly> lis_art

public class Artykuly 
{
List<string> Id_art = new List<string>(); 
List<string> Nazwa = new List<string>(); 
List<string> Id_magazynu = new List<string>();
}

Problem polega że Nazwy artykułów się powielają, te same są na jednym magazynie i te same na drugim a potrzebuję do checkedBox dodać tylko unikalne.

Próbowałem w ten sposób:

IEnumerable<Artykuly> art_wyz = lis_art.Distinct()

ale to nie rozwiązuje problemu, ponieważ wartości Id_magazynu są różne do tego samego artykułu stąd i tak dostaje tą samą listę.

Czy idzie w związku z tym dostać się jakoś do środka by zrobić Distinct według pola Nazwa (w liście)

Proszę o pomoc?

dodanie znaczników <code class="csharp"> - furious programming

1

Czy to nie powinno wyglądać tak:

public Artykul
{
   public int Id {get;set;}
   public string Nazwa {get;set;}
   public int IdMagazynu {get;set;}
}
List<Artykul> list = new List<Artykul>();

Tak to ja nie wiem co ty chcesz zrobić.

0

Tutaj masz przykład jak możesz to zrobić:

class Program
    {
        static void Main(string[] args)
        {
            List<Artykul> artykuly = new List<Artykul>();

            artykuly.Add(new Artykul { Id = 0, Nazwa = "NAZWA", IdMagazynu = 12 });
            artykuly.Add(new Artykul { Id = 1, Nazwa = "NAZWA2", IdMagazynu = 13 });
            artykuly.Add(new Artykul { Id = 2, Nazwa = "NAZWA", IdMagazynu = 14 });

            foreach (var artykul in artykuly.Select(art => art.Nazwa).Distinct())
            {
                Console.WriteLine(artykul);
            }
        }
    }
    public class Artykul
    {
        public int Id { get; set; }
        public string Nazwa { get; set; }
        public int IdMagazynu { get; set; }
    }
0

Nie w klasie Artykuly są listy zawierające kolekcje Id_art, Nazwa i Id_magazynu.
To wszystko dobrze chodzi a jeśli chodzi o dodanie to odbywa się przez stworzenie obiektu:

Artykuly Artykul = new Artykuly();
List<Artykuly> lis_art = new List<Artykuly>();
                    
Artykul.Id_art.Add(czytacz[1].ToString());  //czytacz to ExecuteReader()
Artykul.Nazwa.Add(czytacz[2].ToString());
Artykul.Id_magazynu.Add(czytacz[3].ToString());

lis_art.Add(Artykul);

Ale nie w tym problem chodzi o to żeby wybrać tylko te 'Nazwa' które są unikalne, pamiętając że wszystko znajduje się w List<artykuly> lis_art

dodanie znaczników <code class="csharp"> i `` - furious programming

0

Zaraz sprawdzę Degusto!

0

Chyba nie do końca to dział

      foreach (var artykul in artykuly.Select(art => art.Nazwa).Distinct().ToList())
            {
                 for (int i = 0; i < artykul.Nazwa.Count; i++)
                {
                    checkedListBox2.Items.Add(artykul.Nazwa[i].ToString());
                }
            }

Nie widzi mi elementów artykul związku z tym nie mogę dodać unikalnych elementów:(

dodanie znacznika <code class="csharp"> - furious programming

1

To wszystko dobrze chodzi a jeśli chodzi

Gdyby dobrze chodziło to nie miał byś teraz takich problemów.

A przykład @Degusto nie działa dlatego że on to zrobił na podstawie przykładu który umieściłem w poprzednim poście.

0

Nie ma żadnych problemów z wrzuceniem na ekran, i obrabianiem tej listy list, problem jest z wybraniem unikalnych wartości, umiecie to zrobić czy nie wiecie jak?

0

Dokładnie, użyłem klasy wstawionej przez @dam1an, dlatego to nie może działać dla Twojego przykładu. Uważam, że powinieneś zmienić swoją klasę na tą podaną wyżej.

3
var unikalneNazwyArtykulow = Artykuly.Nazwa.Distinct();

Klasa Artykuly to jakaś strukturalna patologia świadcząca o braku zrozumienia podstaw OOP. W rzeczywistym świecie artykułami nazywamy kolekcję artykułów, a pojedynczy artykuł ma takie cechy jak id, nazwa i id magazynu. Ty zaś tworzysz jakąś alternatywną rzeczywistość, która coraz bardziej będzie utrudniała Ci utrzymanie tego kodu.

0

Trochę mnie zmartwiliście ponieważ na tej liście list działa połowa programu korzysta z niej kilkadziesiąt klas

0

tzn. obiektów

0

Spróbuj tak (działa):

var art_wyz = lis_art.SelectMany(n => n.Nazwa).Distinct();
foreach (var item in art_wyz)
{
     Console.WriteLine(item);
}

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