Jak wyświetlić wszystkie elementy listy po usunięciu jednego z nich używając LINQ

0

Witam, mam kolejny problem z którym nie mogę sobie poradzić i rozkładam już ręce co tu robić. Na dole znajduje się podsumowany problem pod hasłem W SKRÓCIE jakby się komuś nie chciało tych wypocin czytać.

W klasie FuelConsumptionReport dodaję profile raportów spalania do listy, a następnie je zapisuje do XML

 
List<FuelConsumptionProfiles> fuelCompution = new List<FuelConsumptionProfiles>();

fuelCompution.Add(new FuelConsumptionProfiles
            {
                Date = this.DataTextBox.Text,
                FuelPrice = Convert.ToDouble(this.FuelPriceTextBox.Text),
                Mileage = Convert.ToDouble(this.MileagetextBox.Text),
                FuelCount = Convert.ToDouble(this.FuelCountTextBox.Text),
                NameAttribute = Incoming
            });
            //zapis
            SaveXML.SaveData(fuelCompution, "FuelProfiles.xml");

wartość właściwości Date pojawia mi się w moim listBox po jej wybraniu mam dostęp do reszty właściwości.

Musiałem dodać do programu opcję usuwania elementów z tej listy. I tutaj pojawił się problem.
Chodzi o to że mam też klasę podobną do tej CreateCarProfile, gdzie tworzę profile pojazdów. i teraz jak wchodzę obojętnie w który z tych profili wyświetlają mi się w listBox w klasie FuelConsumptionReport raporty związane tylko i wyłącznie z obecnie wybranym Samochodem. Robię to dzięki LINQ.

Czyli np. Dla pojazdu Honda:
list[0] = 1
list[1] = 2

Dla pojazdu Fiat:
list[0] = 3
list[1] = 4

Teraz wybieram Sobie pojazd Fiat i usuwam drugi element z listy(list[1]) = 4. i co się dzieje usuwa mi się wartość z list[1] pojazdu Honda czyli 2.
Jak wiadomo dzieje się tak dlatego że jak dodaje w poszczególnych profilach pojazdów wartości do listy List<FuelConsumptionProfiles> fuelCompution to mamy:

list[0] = 1
list[1] = 2
list[2] = 3
list[3] = 4

dlatego usuwa mi się element [1] z listy zamiast [2]

Usuwam elementy z listy w ten sposób

int selectedIndex = FuelReportlistBox.SelectedIndex; 

Teraz za pomocą LINQ wybieram żeby moja lista raportów spalania List<FuelConsumptionProfiles> fuelCompution zawierała tylko wartości związane z obecnie wybranym pojazdem:

 
fuelCompution = fuelCompution.Where(x => x.NameAttribute == Incoming).ToList();
            fuelCompution.RemoveAt(SelectedIndex);

SaveXML.SaveData(fuelCompution, "FuelProfiles.xml");

Znalazłem takie rozwiązanie na stackoverflow i działa tylko że nie do końca dlatego że mam ten nieszczęsny zapis po tym jak usunę wybrany element. Przez to (UWAGA TERAZ MERITUM ) w zapisanym pliku XML mam tylko raporty spalania, które należą tylko do tego samochodu. Dlatego że

fuelCompution = fuelCompution.Where(x => x.NameAttribute == Incoming).ToList(); 
//Co się tu dzieje to poprostu wybieram raporty spalania związane tylko z obecnie wybranym samochodem.

Jak to zrobić żeby przed zapisem

 SaveXML.SaveData(fuelCompution, "FuelProfiles.xml");

nazwa listy fuelCompution zawierała wszystkie elementy listy a nie tylko te które zostały w danym pojeździe po usunięciu wybranego.

Przepraszam że napisałem taką książkę ale chciałem to dobrze wytłumaczyć o co chodzi mam nadzieje że ktoś pomoże bo już siedzę nad tym tyle i nic nie wychodzi a w pon muszę program pokazać na zaliczenie.

Znalazłem coś takiego jeszcze http://stackoverflow.com/questions/4312437/remove-items-of-list-from-another-lists-with-criteria ale to dla mnie już hard level i nic mi nie wychodzi.

W SKRÓCIE!!

 
public class Klasa
{
List<FuelConsumptionProfiles> fuelCompution = new List<FuelConsumptionProfiles>();

public void metoda()
{
fuelCompution = fuelCompution.Where(x => x.NameAttribute == Incoming).ToList();
            fuelCompution.RemoveAt(SelectedIndex);

SaveXML.SaveData(fuelCompution, "FuelProfiles.xml");
}

}

Przez ten fragment kodu zapisuje do listy elementy związane tylko z x.NameAttribute == Incoming czyli automatycznie kasuje mi się pozostałe rzeczy które mam w pliku XML. Chcę żeby po usunięciu tego elementu z listy zapisując fuelCompution znajdowały się w niej wszystkie elementy - ten co usunąłem a nie tylko te co odpowiadają x.NameAttribute == Incoming.

0

Nie ogarniam.
Co to jest?

list[0] = 1
list[1] = 2
list[2] = 3
list[3] = 4

Co to jest list? Co oznaczają te cyferki?

Chyba wiem o co Ci chodzi.
Dodaj atrybut id do swoich elementów, i kasuj po konkretnym id.

0

Taki mój skrót myślowy... może nie poprawny chodziło mi o o to że jak dodaję do List<FuelConsumptionProfiles> fuelCompution = new List<FuelConsumptionProfiles>(); nową klasę i wyświetlę sobie z niej właściwość Date w listbox to oznaczyłem sobie ją umownie że na listBox przyjmuje ona wartość [0] bo jest pierwsza jeżeli dodam drugą klasę to przyjmie wartość [1], dodam trzecią klasę to na 'listBox' wartość właściwości Data będzie trzecia w kolejce.

Mogę dodawać do tego samego listBox wiele tych klas, tylko że wyświetlają mi się w nim tylko te które należą do obecnie wybranego pojazdu. Czyli załóżmy że dodaje pojazd Honda dla niego dodałem 2 klasy FuelConsumptionProfiles to tylko widzę je na listBox bo należą do tego samochodu i na moim listBox przyjmują wartości [0] i [1] jednakże w moim List<FuelConsumptionProfiles> fuelCompution mam o wiele więcej tych klas już dodanych dlatego jeżeli wybiorę teraz pierwszą na int index = listBox.SelectedIndex załóżmy 1 to jeżeli ją usunę fuelCompution.RemoveAt(index); nie usunie się ona tylko usunie się klasa którą dodałem jako pierwszą. Dlatego chcę użyć
fuelCompution.Where(x => x.NameAttribute == Incoming).ToList(); i teraz jeżeli użyję fuelCompution.RemoveAt(index);to rzeczywiście usunie mi się wybrany index z listBox dla obecnie wybranego samochodu.

dam1an napisał(a):

Dodaj atrybut id do swoich elementów, i kasuj po konkretnym id.

Mógłbyś dokładniej rozwinąć jak Ty to widzisz ?

o coś takiego chodzi?
Moja klasa w programie:

[Serializable]
public class FuelConsumptionProfiles
    {
        [XmlAttribute("ID")]
        public string Date { get; set; }
        public double FuelPrice { get; set; }
        public double Mileage { get; set; }
        public double FuelCount { get; set; }
    } 

Jeżeli tak to jak z tego korzystać, bo jak zaczynałem pisać program chciałem to jakoś wykorzystać ale nie potrafiłem i nie wykorzystałem.

0

Możesz tak:

[Serializable]
public class FuelConsumptionProfiles
    {
        public int Id {get;set;}
        public string Date { get; set; }
        public double FuelPrice { get; set; }
        public double Mileage { get; set; }
        public double FuelCount { get; set; }
    } 

Wtedy zamiast na indexie operujesz na id.

Powinieneś użyć bazy danych do czegoś takiego, było by łatwiej.

0

a co ma się znajdować w Id? Rozumiem że zamiast podawać index w listBoxbędę podawał o jakie Id mi chodzi i klasa związana z tym Id będzie usuwana, ale nie wiem jak to zrobić :/

 object select = listBox.SelectedItem;

?

0

W Id ma się znajdować unikalny identyfikator obiektu.

Zacznij programować obiektowo, utwórz zestaw obiektów opisujących dziedzinę zagadnienia, którym się zajmujesz, a przede wszystkim oddziel logikę aplikacji do GUI. Wtedy nie będziesz miał takich czarodziejskich problemów.

0

No rozumiem, ale jak on ma tam trafić ? mam go sam wpisywać przy tym jak będę dodawał raport spalania ?

somekind napisał(a):

Zacznij programować obiektowo, utwórz zestaw obiektów opisujących dziedzinę zagadnienia, którym się zajmujesz, a przede wszystkim oddziel logikę aplikacji do GUI. Wtedy nie będziesz miał takich czarodziejskich problemów.

Staram się jak mogę :(

0

Generuj takie ID podczas tworzenia obiektu. Ważne, żeby było unikalne dla wszystkich obiektów danego typu.

0

Przez noc wpadłem na jeszcze jeden pomysł. otóż moje List<FuelConsumptionProfiles> fuelCompution = new List<FuelConsumptionProfiles>(); zapisuje do:

 
List<FuelConsumptionProfiles> fuel = new List<FuelConsumptionProfiles>();
fuel = fuelCompution;

//wybieram interesujące mnie elementy czyli tylko te które należą do wybranego auta i usuwam
fuel = fuel.Where(x => x.NameAttribute == Incoming).ToList();
            fuel.RemoveAt(index);

Tylko teraz mam problem jak to zrobić żeby 2 listy wrzucić do jednej i zapisać jakby nigdy nic do XML ?

Mam to zrobione tak:

fuelCompution = fuelCompution.Where(p => !fuel.Any(p2 => p2.Date == p.Date)).ToList();
SaveXML.SaveData(fuelCompution, "FuelProfiles.xml"); 

Edit: jednak ujowato to działa nie wiem czemu czasem usunie 2 zamiast jednego i nie da sie usnac ostanitego elementu na liście. Nie mam pojęcia już..

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