2013-12-13 2 views
5

Sto usando C# Framework 3.5 ..Come ottenere un elenco distinto da un elenco personalizzato?

mia classe qui

public class KonumBilgisi 
{ 

    public string Enlem { get; set; } 
    public string Boylam { get; set; } 
    public string KonumAdi { get; set; } 
    public DateTime Tarih { get; set; } 
    public byte SucTuruId { get; set; } 

} 

Ho una lista

Lista konumlar;

bene, voglio ottenere elementi che la parità di loro enlem e variabili boylam vicenda ..

Come si vede sulla foto qui sotto

enter image description here

voglio compate enlem e boylam e se è uguale voglio portarli in una lista diversa ..

Posso farlo con un ciclo ma voglio usare LINQ ma non potrei farlo. Ho usato groupby ma doesnt sbagliato ..

var distinctList = konumlar.GroupBy(x => x.Enlem) 
         .Select(g => g.First()) 
         .ToList().GroupBy(s=>s.Boylam).Select(g => g.First()) 
         .ToList(); 

EDIT In realtà non potevo spiegare il mio quesion bene ..

forse distinto non è parola giusta .. voglio separare gli elementi che sono uguale a ciascun altro ..

come ad esempio:

prenderò articoli Pendik in una sola lista e altri saranno in konumlar ma gli elementi Pendik saranno rimossi da konuml Lista ar

EDIT 2

Va bene che voglio separare la lista come quella

enter image description here

enter image description here

+0

Si desidera estrarre elementi uguali o distinti? –

+0

estratto e anche discreto dalla lista .. Voglio dire, voglio separarli a vicenda – ertan2002

+0

Sarebbe di grande aiuto se mostrassi il risultato desiderato. Stai anche citando una seconda lista ma non l'hai mostrata. –

risposta

4

siete quasi arrivati ​​- invece di usare due GroupBy chiamate separate, utilizzare uno solo, con una chiave in due parti:

var distinctList = konumlar 
    .GroupBy(s => new {s.Enlem, s.Boylam}) 
    .Select(g => g.First()) 
    .ToList(); 

EDIT: Per ottenere tutte le voci tranne quelli con i duplicati, modificare la query come segue:

var noPendiks = konumlar 
    .GroupBy(s => new {s.Enlem, s.Boylam}) 
    .Where(g => g.Count() == 1) 
    .Select(g => g.Single()) // You know there's only one 
    .ToList(); 

È possibile che questo vi darà tutte le voci tranne le "Pendik" quelli. Per ottenere solo i s "Pendik", utilizzare la query di seguito:

var pendiks = konumlar 
    .GroupBy(s => new {s.Enlem, s.Boylam}) 
    .Where(g => g.Count() > 1) 
    .SelectMany(g => g) 
    .ToList(); 
+0

L'utilità di tale chiave composta tramite tipi anonimi in 'GroupBy' non può essere sottovalutata. Trai beneficio direttamente dall'implementazione automatica dell'uguaglianza. –

+0

Penso che sia lo stesso di quello che ho scritto sopra, ma voglio cose diverse, scusami, ho aggiornato la mia domanda, potresti guardarla? – ertan2002

+0

Hey Funziona come voglio .. Grazie mille .. – ertan2002

2

È possibile utilizzare la) funzione distinta (LINQ, però, che non funzionano solo oggetti identici. Nel caso in cui si desideri DistinctBy(), è possibile creare una classe LinqExtensions con un metodo DistinctBy().

Ecco quello che io uso abbastanza comune:

/// <summary> 
///  Provides common extension methods on LINQ members. 
/// </summary> 
public static class LinqExtensions 
{ 
    #region Members 

    public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) 
    { 
     HashSet<TKey> seenKeys = new HashSet<TKey>(); 
     foreach (TSource element in source) 
     { 
      if (seenKeys.Add(keySelector(element))) 
      { 
       yield return element; 
      } 
     } 
    } 

    #endregion Members 
} 

usarlo come:

var distinctList = konumlar.DistinctBy(x => x.property && x.property2 && ...); 

Cordiali saluti

+0

grazie, sembra carino ma ho ottenuto un'eccezione. Errore L'operatore '&&' non può essere applicato agli operandi di tipo 'stringa' e 'stringa' .. e in secondo luogo, ho aggiornato la mia domanda .. potreste cercarla? – ertan2002

1

Presumo che questo è ciò che si vuole:

List<KonumBilgisi> distinctList = konumlar 
    .GroupBy(k => new { k.Enlem, k.Boylam }) 
    .SelectMany(x => x.GroupBy(k => k.Boylam).First()) 
    .ToList(); 

Seleziona elementi unici acco utilizzando queste due proprietà, seleziona elementi unici in base a Boylam.

+0

scusa, ho modificato la mia domanda. È sbagliato. – ertan2002