如何从自定义列表中获取不同的列表?

时间:2013-12-13 11:23:26

标签: c# linq list equality

我正在使用c#framework 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

我想与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();

修改 实际上我无法解释我的问题..

也许不同是不正确的单词..我想分开彼此相等的项目..

如:

我将把pendik项目放在一个列表中 和其他人将在konumlar,但pendik项目将从konumlar列表中删除

编辑2

好的,我想像那样单独列出

enter image description here

enter image description here

3 个答案:

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

以上将为您提供除“pendik”之外的所有项目。要仅获取“pendik”,请使用以下查询:

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

答案 1 :(得分: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 && ...);

亲切的问候

答案 2 :(得分:1)

我认为这就是你想要的:

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

根据这两个属性选择唯一项目,然后根据Boylam选择唯一项目。