2013-12-13 152 views
5

我使用C#3.5框架..如何從自定義列表中獲取不同的列表?

我這裏一流

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

} 

我有一個列表

名單konumlar;

好,我想拿到等於他們enlem和boylam變量相互物品..

正如你下面

enter image description here

照片看,我想compate enlem和boylam和如果它的平等我想讓他們到不同的名單..

我可以做一個循環,但要使用LINQ,但我無法做到這一點。我用GROUPBY但它不出錯..

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

編輯 其實我不能解釋我quesion以及..

也許不同的是不正確的字。我想單獨它們等於每個項目等..

如:

我將在一個列表 彭蒂克項目等將在konumlar但彭蒂克項目將從konuml被刪除AR列表

EDIT 2

好吧,我想單獨列表一樣,

enter image description here

enter image description here

+0

你想提取相同或不同的項目? –

+0

提取物,也從列表disexct ..我的意思是,我想分開他們彼此 – ertan2002

+0

這將有助於,如果你會顯示所需的結果。你還提到了第二個列表,但你沒有顯示它。 –

回答

4

你幾乎沒有 - 而不是使用兩個單獨的GroupBy電話,使用一個單一的,與一個兩部分的關鍵:

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

編輯:要獲得所有項目除了只是那些重複的,查詢修改如下:

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

上述會給你的所有項目除「彭蒂克」的。爲了得到只有「彭蒂克」 S,使用下面的查詢:

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

通過'GroupBy'中匿名類型的組合鍵的有用性不能低估。您直接從平等的自動實施中受益。 –

+0

我覺得它和我上面寫的一樣,但我想要不同的東西,對不起,我更新了我的問題,你能看看它嗎? – ertan2002

+0

嘿它的工作原理是什麼..非常感謝.. – ertan2002

2

但是,您可以使用DISTINCT()LINQ的功能,這並只工作相同的項目。如果你想要一個DistinctBy(),你可以使用DistinctBy()方法創建一個LinqExtensions類。

這裏有一個我使用相當普遍:

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

使用它作爲:

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

親切的問候

+0

謝謝你看起來不錯,但我得到了一個例外。錯誤運算符'&&'不能應用於'string'和'string'類型的操作數。其次,我更新了我的問題。你能找到它嗎? – ertan2002

1

我想這是你想要什麼:

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

它選擇獨特的項目acco rding這兩個屬性,然後它根據Boylam選擇獨特的項目。

+0

對不起,我編輯了我的問題。這是我的錯誤.. – ertan2002

相關問題