2013-12-13 23 views
5
Ben C# framework 3.5 kullanıyorum

..Özel bir listeden ayrı bir liste nasıl alınır?

burada benim sınıf I listemizi

Liste konumlar var

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; } 

} 

;

iyi, ben .. bunların enlem ve birbirlerine balance değişkenleri eşit öğeleri almak istiyorum

ben enlem ve Boylam rekabet etmektedir istiyorum

enter image description here

aşağıdaki fotoğrafta gördüğünüz gibi

ve Eğer eşitse onları farklı bir listeye almak istiyorum ..

Bunu bir döngü ile yapabilirim ama LINQ kullanmak istiyorum ama bunu yapamam. Ben GroupBy kullanılan ama yanlış doesnt ..

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

DÜZENLEME Aslında .. Her eşittir olan öğeleri ayırmak isteyen de benim quesion ..

belki farklı doğru kelime değil açıklamak edemedim diğer ..

örneğin:

Ben tek listede pendik öğeleri alacak ve diğerleri konumlar olacaktır ama pendik ürün konuml kaldırılacak ar liste

DÜZENLEME 2

böyle listeyi ayırmak isteyen Tamam

enter image description here

enter image description here

+0

Eşit veya farklı öğeler mi çıkarmak istiyorsunuz? –

+0

listeden ayıklamak ve aynı zamanda farklıdır .. Yani, birbirlerini birbirinden ayırmak istiyorum – ertan2002

+0

İstediğiniz sonucu gösterseydiniz yardımcı olur. Ayrıca ikinci bir listeden bahsediyorsunuz ama göstermediniz. –

cevap

4
Neredeyse orada

- ziyade iki ayrı GroupBy çağrıları kullanmak yerine, İki parçalı bir anahtarla bir tane kullanın:

DÜZENLEME:, tekrarlar da tüm öğeleri dışında olanları almak şöyle sorguyu değiştirmek için:

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(); 

yukarıdaki "pendik" dışındaki size tüm öğeleri verecektir. Sadece özdeş öğeler çalışır ki Bununla birlikte, Farklı() Linq işlevini kullanabilirsiniz

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

Bu karma anahtarın 'GroupBy'de anonim türler aracılığıyla kullanışlılığı anlaşılamıyor. Doğrudan eşitliğin otomatik uygulamasından yararlanırsınız. –

+0

Ben de yukarıda yazdığımın aynısını düşünüyorum, ama farklı şeyler istiyorum, bunun için üzgünüm, sorumu güncelledim, ona bakar mısınız? – ertan2002

+0

Hey İstediğim gibi çalışıyor .. Çok teşekkür ederim .. – ertan2002

2

: Sadece "pendik" cevabı için aşağıdaki sorguyu kullanın. Bir DistinctBy() istiyorsanız, DistinctBy() yöntemiyle bir LinqExtensions sınıfı oluşturabilirsiniz.

Burada oldukça yaygın kullanan biri: Ben bu istediğini varsayalım

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

Tür

+0

Teşekkür ederim güzel görünüyor ama bir istisna var. Hata Operatör '&&', 'string' ve 'string' türünde işlenenlere uygulanamaz .. ans ikinci olarak, soruyu güncelledim .. bakabilir misiniz? – ertan2002

1

ilgili:

/// <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 
} 

olarak kullanın

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

Benzersiz öğeleri seç Bu iki özelliği rining, daha sonra Boylam göre benzersiz öğeleri seçin.

+0

Üzgünüm, sorumu düzenledim. Bu benim yanlış ... – ertan2002

İlgili konular