IEnumerable,它的通用对应物IEnumerable <T>是用于通过项集合迭代(或枚举)的.NET接口。
在 C# 中为 IEnumerable<string> 的每个成员添加前缀/后缀
有没有一种简单的方法可以为 IEnumerable 的每个成员添加前缀或后缀?除此之外我想不出其他方法(其中输入是 IEnumerable): var sb = new StringBuilder(); foreach (var str in i...
我有两个可枚举:IEnumerablelist1和IEnumerablelist2。我想同时迭代它们,例如: foreach((a, b) in (列表1, 列表2)) { // 使用a和b ...
解释每个操作的位置,即 WHERE 和 TAKE。 对于 IEnumerable 和 IQueryable,在内存中或在数据库端。 IEnumerable listStudents = DBContext.Students.Where(x =...
是否有 Linq 方法可以将单个项目添加到 IEnumerable<T>?
我正在尝试做这样的事情: 图像.图层 它为除父层之外的所有层返回 IEnumerable,但在某些情况下,我只想这样做: image.Layers.With(图像.
IEnumerator 和 IEnumerable 有什么区别? [重复]
可能的重复: 谁能给我解释一下 IEnumerable 和 IEnumerator 吗? IEnumerator 和 IEnumerable 有什么区别?
有没有一种简单的方法将 IEnumerable 转换为 TheoryData? 例如,如果我想传递一组枚举选项,我正在寻找类似的内容: IEnumerable&...
.NET 4.0、C# 中 default(IEnumerable) 的值是多少? (非常简单)
有多个 IEnumerable 实例,我想首先获取每个实例的第一个实例,然后获取每个实例的第二个实例,依此类推。 如果它们是列表,我会这样做: 列表>
yield 中的 IEnumerable 是否可以为 null?
从yield表达式获得的IEnumerable可以为null吗?
Enumerable.SelectMany 抛出错误 CS0411 - 无法从用法推断
我正在使用c#,.net 6.0 我正在尝试将 IEnumerable 方法和 ot 的调用者方法转换为异步工作。 我有一个看起来像这样的代码: 公共 IEnumerable 得到...
IEnumerable 和 console.writeline
我有这个简单的代码: 使用系统; 使用 System.Collections.Generic; 使用 System.Linq; 使用系统文本; 使用 System.Threading.Tasks; 使用系统数据; 使用 System.Data.Entity; 命名空间
IEnumerable 的 GetEnumerator() 隐式和显式实现之间的区别
我有这个类,但我不明白为什么有一个实现是有用的:public IEnumerator GetEnumerator(),另一个实现是:IEnumerator IEnumerable.GetEnumerator()。我知道要...
将 3 个 IEnumerable<Application> 列表合并为一个
我简化了我的问题 公开课申请 { 公共 int Id { 得到;放; } 公共 int 版本 { 获取;放; } 公共 int 状态 { 获取;放; } } 我的 3 个清单: IE可枚举 我简化了我的问题 public class Application { public int Id { get; set; } public int Version { get; set; } public int Status { get; set; } } 我的 3 个清单: IEnumerable<Application> applications1 = new List<Application> { new Application {Id = 1, Version = 1, Status = 1}, new Application {Id = 2, Version = 1, Status = 1}, new Application {Id = 3, Version = 3, Status = 1} }; IEnumerable<Application> applications2 = new List<Application> { new Application {Id = 1, Version = 2, Status = 2}, new Application {Id = 2, Version = 2, Status = 2}, new Application {Id = 3, Version = 1, Status = 0} }; IEnumerable<Application> applications3 = new List<Application> { new Application {Id = 1, Version = 5, Status = 1}, new Application {Id = 2, Version = 0, Status = 1}, new Application {Id = 3, Version = 6, Status = 1} }; 我想制作这个: IEnumerable<Application> applications4 = new List<Application> { new Application {Id = 1, Version = 5, Status = 2}, new Application {Id = 2, Version = 2, Status = 2}, new Application {Id = 3, Version = 6, Status = 1} }; 即具有最高版本和状态值的列表。 我尝试过 LINQ 但我不明白。 我最好的是这个,但它只是获得了最高版本。我不明白当有 2 个属性可供选择时我该怎么做: IEnumerable<Application> applications4 = applications1 .Concat(applications2) .Concat(applications3) .GroupBy(a => a.Id) .Select(g => g.Aggregate((acc, curr) => acc.Version > curr.Version ? acc: curr )) .ToList(); 您应该使用 Max() 从分组属性中获取最大值。 IEnumerable<Application> applications4 = applications1 .Concat(applications2) .Concat(applications3) .GroupBy(a => a.Id) .Select(g => new Application { Id = g.Key, Version = g.Max(x => x.Version), Status = g.Max(x => x.Status) }) .ToList(); 您的问题忽略了一个非常重要的点 - 哪个属性(版本或状态)更重要? 我假设版本更重要,并创建了一个自定义比较器来对结果进行排序。基本上我想要的是按应用程序 ID 对项目进行group,然后获得最高的结果。我使用自定义比较器来获取它。如果您不想使用比较器,可以随时将其更改为: .Select(x => x.OrderByDescending(x => x.Version).ThenBy(x => x.Status).First()); internal class Program { static async Task Main(string[] args) { IEnumerable<Application> applications1 = new List<Application> { new Application {Id = 1, Version = 1, Status = 1}, new Application {Id = 2, Version = 1, Status = 1}, new Application {Id = 3, Version = 3, Status = 1} }; IEnumerable<Application> applications2 = new List<Application> { new Application {Id = 1, Version = 2, Status = 2}, new Application {Id = 2, Version = 2, Status = 2}, new Application {Id = 3, Version = 1, Status = 0} }; IEnumerable<Application> applications3 = new List<Application> { new Application {Id = 1, Version = 5, Status = 1}, new Application {Id = 2, Version = 0, Status = 1}, new Application {Id = 3, Version = 6, Status = 1} }; // you can use OrderByDescending().First() for applications using EF lower than 6.0.0 var applications4 = applications1.Union(applications2).Union(applications3) .GroupBy(x => x.Id) .Select(x => x.MaxBy(x => x, new VersionStatusComparer())); foreach (var item in applications4) { Console.WriteLine("Id: {0} Version: {1} Status: {2}", item.Id, item.Version, item.Status); } } } internal class VersionStatusComparer : IComparer<Application> { public int Compare(Application? x, Application? y) { var versionResult = CompareVersion(x.Version, y.Version); if (versionResult == 0) { return CompareStatus(x.Status, y.Status); } return versionResult; } private int CompareVersion(int xVersion, int yVersion) { if (xVersion > yVersion) { return 1; } else if (xVersion < yVersion) { return -1; } return 0; } private int CompareStatus(int xStatus, int yStatus) { if (xStatus > yStatus) { return 1; } else if (xStatus < yStatus) { return -1; } return 0; } } } 这是一种更面向 OOP 的方法,但我希望它看起来更明确。如果您需要更复杂的场景,您可以更新 Merge 逻辑。 它具有 O(n) 复杂度(n 个元素的数组需要 n 个“陡峭”才能完成)并使用字典: public class Application { public int Id { get; set; } public int Version { get; set; } public int Status { get; set; } public bool Merge(Application app){ if(app.Id != Id) return false; this.Version = Math.Max(app.Version, this.Version); this.Status = Math.Max(app.Status, this.Status); return true; } } //... IEnumerable<Application> applications4 = new List<Application>(); Dictionary<int,Application> res = new Dictionary<int,Application>(); foreach( var app in applications1.Concat(applications2).Concat(applications3) ){ // existing value, then update if( res.TryGetValue( app.Id, out Application appToProceed )) appToProceed.Merge(app); // new id value, then add else res.Add(app.Id,app); } // applications4 = res.Values.ToList(); 关于基准测试结果,它是关于 ns 的,所以只是作为信息: | Method | Mean | Error | StdDev | Gen0 | Allocated | |---------------------------------------------- |-----------:|--------:|--------:|-------:|----------:| | Benchmark_Using_Dictionary__3List_1000Element | 226.8 ns | 3.03 ns | 2.84 ns | 0.0780 | 408 B | | Benchmark_Using_LINQ__3List_1000Element | 299.7 ns | 4.04 ns | 3.59 ns | 0.1040 | 544 B | | Benchmark_Using_Dictionary__3List_3Element | 652.5 ns | 2.09 ns | 1.85 ns | 0.1125 | 592 B | | Benchmark_Using_LINQ__3List_3Element | 1,631.4 ns | 8.12 ns | 7.59 ns | 0.2842 | 1488 B | (3List 表示 app1 + app2 + app3 和 1000Element 表示每个应用程序有 1000 个 id 可以使用)
将 3 个 IEnumerable<customObj>“列表”合并为 1 个 IEnumerable<customObj>
我简化了我的问题 自定义对象 公开课申请 { 公共 int Id { 得到;放; } 公共 int 版本 { 获取;放; } 公共 int 状态 { 获取;放; } } 我的 3 个“列表&q...
嗨,如何在 IEnumerable<> 列表上使用 foreach?
public IEnumerable 合并(IEnumerable 第一,IEnumerable 第二) { }
如何测试 IEnumerable.GetEnumerator() 方法?
假设我有一个生成斐波那契数的类: 公共类斐波那契数列:IEnumerable { 公共 IEnumerator GetEnumerator() { ...
C#:如何测试 IEnumerable.GetEnumerator() 方法?
假设我有一个生成斐波那契数的类: 公共类斐波那契数列:IEnumerable { 公共 IEnumerator GetEnumerator() { ...
如何对使用存储过程检索的记录在 ToList() 之前执行 Count()?
这是我的代码: // 网格查询 var data = ctx.spRewards(月, 年, null, MedicalID).Select(p => new { MedicalID = p.MedicalID, 日期奖励 = p.日期奖励, 医疗 = p.医疗,
我有多个对象数组: A、B、C。 它们都具有相同的长度。 我想编写一个函数,将数组的每个元素“合并”为结果数组中的单个元素。 一个