- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一组对象,它们本身包含一个集合。
private class Pilot
{
public string Name;
public HashSet<string> Skills;
}
这是一些测试数据:
public void TestSetComparison()
{
var pilots = new[]
{
new Pilot { Name = "Smith", Skills = new HashSet<string>(new[] { "B-52", "F-14" }) },
new Pilot { Name = "Higgins", Skills = new HashSet<string>(new[] { "Concorde", "F-14" }) },
new Pilot { Name = "Jones", Skills = new HashSet<string>(new[] { "F-14", "B-52" }) },
new Pilot { Name = "Wilson", Skills = new HashSet<string>(new[] { "F-14", "Concorde" }) },
new Pilot { Name = "Celko", Skills = new HashSet<string>(new[] { "Piper Cub" }) },
};
我想使用 OrderBy
在 Linq 中,以便:
我想我需要实现一个 IComparer<Pilot>
传入 OrderBy
但不知道如何处理“无关紧要”方面(上图)和稳定排序。
更新:
我希望输出是相同五个的数组 Pilot
对象,但以不同的顺序。
最佳答案
当 GroupBy
你必须实现 IEqualityComparer<T>
对于您要分组的类型(在您的情况下为 HashSet<string>
),例如
private sealed class MyComparer : IEqualityComparer<HashSet<string>> {
public bool Equals(HashSet<string> x, HashSet<string> y) {
if (object.ReferenceEquals(x, y))
return true;
else if (null == x || null == y)
return false;
return x.SetEquals(y);
}
public int GetHashCode(HashSet<string> obj) {
return obj == null ? -1 : obj.Count;
}
}
然后使用它:
IEnumerable<Pilot> result = pilots
.GroupBy(pilot => pilot.Skills, new MyComparer())
.Select(chunk => string.Join(", ", chunk
.Select(item => item.Name)
.OrderBy(name => name))); // drop OrderBy if you want stable Smith, Jones
Console.WriteLine(string.Join(Environment.NewLine, result));
结果:
Jones, Smith
Higgins, Wilson
Celko
编辑:如果您想要一个数组重新排列,那么添加SelectMany()
为了展平分组和最后的ToArray()
:
var result = pilots
.GroupBy(pilot => pilot.Skills, new MyComparer())
.SelectMany(chunk => chunk)
.ToArray();
Console.WriteLine(string.Join(", ", result.Select(p => p.Name)));
结果:
Jones, Smith,
Higgins, Wilson,
Celko
请注意,string.join 将每个组的名称组合在一行中,即 Jones, Smith
两者具有相同的技能组合。
以 DotNetFiddle 运行
关于c# - Linq OrderBy 对具有相同集合的对象进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49749307/
所以我尝试使用angularjs的orderby函数。目前我有一个原始数据集。 $scope.customers = [ {"name" : "Bottom-Dollar Market
我有一个包含以下数据的表列 (Varchar): COLUMN_NAME 102100 1-2000 112100 当我在 SQL 语句中使用 OrderBy 时,我按以下顺序获取项目: COLUMN
我正在研究一些 LINQ 排序,因为我有一个 ID 列表,我需要按顺序对它们进行排序。但是,某些 ID 需要优先于标准顺序。 鉴于此 C# 代码(可以粘贴到 .NET Fiddle 中进行测试),排序
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在寻找这些 LINQ 表达式的确认/澄清: var context = new SomeCustomDbContext() // LINQ to Entities? var items = co
我的数据在我的 firebase 中看起来像这样。 users: { -KOwKNCB5IiDBxY9FNzR: { content: { blah blah }, timestamp:147
在尝试找出一段代码不同步的原因后,我开始意识到 TSQL OrderBy 与 Linq OrderBy 对于字符串的差异很大。所以很自然地,我必须找到一种方法来确保来自 tsql 的语句返回与 lin
目前,如果我们将订购方向作为外部依赖项,我们必须使用 if 来应用此方向: public static IEnumerable getlist(string directory, string sea
我在我的范围内有一个对象列表,我想遍历它们,以按某些属性排序的方式显示它们的一些属性并更改它们。 ng-repeat 用于显示绑定(bind)到列表中每个对象的文本框,并应用以“position”作为
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我正在尝试以 asc 顺序显示从今天开始的特定接下来几天的约会列表。(例如:接下来的 5 天或 10 天)。仅从今天开始,接下来的 5 天或 10 天(注意:天数将是动态的,我的意思是客户将设置)。当
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: Which LINQ syntax do you prefer? Fluent or Query Expressi
我目前有一个 OData V4 服务,它具有以下模型。 “类别”——“代码” 对于每个类别,可以有许多代码。 我需要 $expand the Codes, $filter where Active =
可以说注释表具有以下结构: id | author | timestamp | body 我想使用索引有效地执行以下查询: r.table('comments').getAll("me", {inde
是否可以像这样使用 LINQ OrderBy: .OrderBy(x=>(x.SourceID == 3), (x.SourceID == 2), (x=>x.SourceID == 4), (x.S
我有一个这样的数组: $scope.telcodes = ['44', '01', '221', '335']; 如何在像这样的简单数组上使用 orderBy 来生成从 01 开始的有序列表? 我知道
我有一个像这样 Eloquent 查询: Forum::with(['comments.user'])->find($id); 这将返回嵌套结果 forum -> its comments -> us
我正在尝试通过 ManyToMany 注释自动对报告的结果进行排序 @OrderBy : /** * @ORM\ManyToMany(targetEntity="Artist", inversedB
是否有按几列对 data.frame 进行排序的标准方法,但随着减少或增加的变化?例如,您可能希望按一个变量(递减)和下一个(递增)对 data.frame 进行排序。 有没有类似的东西: mydf[
我有一个 linq 查询,无论出于何种原因,它都没有像我期望的那样返回订购。任何人都可以指出我为什么以及我做错了什么的正确方向吗? 代码如下: List designer = null; using
我是一名优秀的程序员,十分优秀!