C# 如何从自定义列表中获取不同的列表?
我使用的是c框架3.5 我的班级在这里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; }
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();