2016-11-08 17 views
5

Mam listę obiektów, każdy obiekt ma właściwość total.Jak utworzyć wyraźną listę liczb całkowitych z listy obiektów?

Potrzebuję utworzyć nowy List<int> z powyższej listy. Problem polega na tym, że jeśli dwa obiekty mają total = 4, to List<int> powinien zawierać tylko jeden znak "4".

niech będzie moja lista:

[ 
    {name: "vishnu" , total: 10}, 
    {name: "vishnu2", total: 11}, 
    {name: "vishnu3", total: 15}, 
    {name: "vishnu4", total: 10} 
] 

więc w moim liście całkowite wyjście powinno być:

10,11,15

a nie:

10,11,15,10

+4

Czy mógłbyś dodać swój kod? – fubo

Odpowiedz

10

użyciu LINQ:

myObjects.Select(obj => obj.total).Distinct().ToList() 
+6

Uwaga na przyszłość: zawijanie kodu z "' "tworzy blok kodu (użyteczny do wstawiania w zdaniu), chociaż cztery spacje na początku (lub naciśnięcie ctrl - k przy podświetlaniu kod) zapewnia ładniej wyglądający blok z podświetlaniem składni. – Rob

+0

Rozwiązanie jest takie samo –

+0

@MongZhu To było trzy minuty wcześniej.Chociaż wiele twierdzeń ** tylko ** jakość ma znaczenie dla SO, jest również ogromny czynnik czasu, co sprawia, że ​​pierwsza odpowiedź jest najbardziej zauważalna. – HimBromBeere

1

Można użyć coś takiego:

var result = myInput.GroupBy(x => x.Total).Select(x => new 
{ 
    Total = x.Key, 
    Name = x.First().Name 
}); 

to tworzy nową listę anonimowych typu, gdzie każdy element ma Toal i Name -property. Jednak rozważa się tylko pierwszy element grupy, jeśli więcej niż jeden jest połączony razem.

Zaletą tego rozwiązania jest to, że utrzymuje się on w wartościach Name. Jeśli tego nie potrzebujesz i interesuje Cię tylko numer Total, to łatwiejsze jest sugerowanie go przez inne osoby.

1

Coś takiego?

using System.Linq; 
... 

var list = new List <YourClass>(); 
... 
var newList = list.Select(i => i.total).Distinct().ToList(); 
4

Dlaczego chcesz przechowywać odrębne elementów w List<T>? Wydaje się, że jest to niewłaściwy typ kolekcji. Proponuję za pomocą HashSet<T> który został specjalnie zaprojektowanego dla tej:

https://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx

Implementacja może być tak proste, jak

HashSet<int> result = new HashSet<int>(list.Select(item => item.total)); 

test

// 10, 11, 15 
Console.Write(String.Join(", ", result)); 

Jeśli nalegać na List<int> :

+0

Chcę wyświetlić listę rozwijaną z całkowitą no.s, więc lista int jest wystarczająco ryt? –

+0

@hilda sonica: pokazywanie odrębnych liczb tylko 'myComboBox.Items.AddRange (list.Select (item => item.total) .Distinct(). Wybierz (item => (object) item .ToArray()); '; aby wyświetlić elementy z ich wielkościami: 'myComboBox.Items.AddRange (list.GroupBy (item => item.total). Wybierz elementy (chunk => $" {chunk.Key}: {chunk.Count()} items (s) "). ToArray());' –

Powiązane problemy