Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从自定义列表中获取不同的列表?_C#_Linq_List_Equality - Fatal编程技术网

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

C# 如何从自定义列表中获取不同的列表?,c#,linq,list,equality,C#,Linq,List,Equality,我使用的是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; }

我使用的是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变量彼此

如下图所示

我想把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();
编辑 实际上我不能很好地解释我的问题

也许distinct这个词不合适。。我想把相等的项目分开

例如:

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

编辑2

好的,我想这样把名单分开


您就快到了—与其使用两个单独的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();

但是,您可以使用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
}

亲切问候

我想这就是你想要的:

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

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

要提取相同或不同的项吗?提取并从列表中删除。。我的意思是,我想把它们彼此分开,如果你能显示出想要的结果,那会有帮助的。您还提到了第二个列表,但您没有显示它。@TimSchmelter,好的,我再次编辑了它:通过GroupBy中的匿名类型,该组合键的有用性不能低估。你可以直接从平等的自动实现中受益。我想这和我上面写的是一样的,但我想要不同的东西,对不起,我更新了我的问题,你能看一下吗?谢谢,看起来不错,但我有一个例外。错误1运算符“&&”不能应用于“string”和“string”类型的操作数。。其次,我更新了我的问题。。你能找一下吗?
List<KonumBilgisi> distinctList = konumlar
    .GroupBy(k => new { k.Enlem, k.Boylam })
    .SelectMany(x => x.GroupBy(k => k.Boylam).First())
    .ToList();