博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展 IEnumerable<T>,让它根据另一个集合的顺序来排列
阅读量:4316 次
发布时间:2019-06-06

本文共 3435 字,大约阅读时间需要 11 分钟。

假如我有两个集合:

public class Teacher{    public int Id { get; set; }    public string Name { get; set; }}public class Student{    public int Id { get; set; }    public string UserName { get; set; }    public int TeacherId { get; set; }}

集合代码:

static void Main(string[] args){    IEnumerable
teachers = new Teacher[] { new Teacher{ Id = 9, Name = "CCC" }, new Teacher{ Id = 5, Name = "AAA" }, new Teacher{ Id = 7, Name = "BBB" }, new Teacher{ Id = 13, Name = "DDD" }, }; IEnumerable
students = new Student[] { new Student{ Id = 1, TeacherId = 13, UserName = "张三" }, new Student{ Id = 2, TeacherId = 5, UserName = "李四" }, new Student{ Id = 3, TeacherId = 9, UserName = "王五" }, new Student{ Id = 4, TeacherId = 18, UserName = "赵六" }, };}

前提条件:students 里面的 TeacherId 大部分来自于 teachers 里的 ID, 也可能不是。

现在要求:按 teachers 的 顺序 来对 students 里面的项排序。

我的代码如下:

首先扩展 IEnumerable<T>

public static class EnumerableExtensions{    ///     /// 按照另一个现有的集合的关联字段来排序    ///     /// 
类型1
///
类型2
/// 要排序的集合 /// 参考的集合 /// 条件 ///
public static IEnumerable
OrderByOther
(this IEnumerable
source1, IEnumerable
source2, Func
condition) { if (source1 == null) { throw new ArgumentNullException("source1"); } if (source2 == null) { throw new ArgumentNullException("source2"); } if (condition == null) { throw new ArgumentNullException("condition"); } int source1Count = source1.Count(); SortedDictionary
values = new SortedDictionary
(); // 3, 0, 2, -1, -1 for (int i = 0; i < source1Count; i++) { var item = source1.ElementAt(i); var tempIndex = source2.FirstIndex(s => condition(item, s)); values.Add(tempIndex, item); } foreach (var item in values) { yield return item.Value; } } ///
/// 得到满足条件的第一个元素在集合中所在的索引 /// ///
类型
///
目标集合 ///
条件 ///
如果没有找到,返回 -1
public static int FirstIndex
(this IEnumerable
source, Predicate
condition) { if (source == null) { throw new ArgumentNullException("source"); } if (condition == null) { throw new ArgumentNullException("condition"); } int i = 0; foreach (var item in source) { if (condition(item)) { return i; } i++; } return -1; }}

然后测试代码如下:

static void Main(string[] args){    IEnumerable
teachers = new Teacher[] { new Teacher{ Id = 9, Name = "CCC" }, new Teacher{ Id = 5, Name = "AAA" }, new Teacher{ Id = 7, Name = "BBB" }, new Teacher{ Id = 13, Name = "DDD" }, }; IEnumerable
students = new Student[] { new Student{ Id = 1, TeacherId = 13, UserName = "张三" }, new Student{ Id = 2, TeacherId = 5, UserName = "李四" }, new Student{ Id = 3, TeacherId = 9, UserName = "王五" }, new Student{ Id = 4, TeacherId = 18, UserName = "赵六" }, }; // 前提条件:students 里面的 TeacherId 大部分来自于 teachers 里的 ID, 也可能不是。 // 现在要求:按 teachers 的 顺序 来对 students 里面的项排序。 var result = students.OrderByOther(teachers, (a, b) => a.TeacherId == b.Id); foreach (var item in result) { Console.WriteLine("stuId:" + item.TeacherId + ", stuName:" + item.UserName); }}

运行结果:

谢谢浏览!

转载于:https://www.cnblogs.com/Music/p/ienumberable-extensions.html

你可能感兴趣的文章
委托异步回调
查看>>
扩展欧几里得算法
查看>>
いつでもどこでも本格的に麻雀&チュートリアルが充実!iPhone/iPod touch/iPad向け「雀龍門Mobile」をiPadで遊んでみました...
查看>>
如何重置mysql中的root密码
查看>>
bzoj 3171: [Tjoi2013]循环格 最小费用最大流
查看>>
关于IO的一些数字
查看>>
高放的c++学习笔记之模板与泛型编程
查看>>
bzoj 1089: [SCOI2003]严格n元树
查看>>
mybatis 日期比较
查看>>
更新jdk
查看>>
string与StringBuilder之性能比较
查看>>
python3----练习题(购物车)
查看>>
IOS不错的学习资源特别是图片效果的处理上
查看>>
HDU 2072(字符串的流式操作,学习了)
查看>>
win10 vs2015源码编译opencv、opencv_contrib、Tesseract
查看>>
css取消a标签在移动端点击时的背景颜色
查看>>
Annotation(注解)
查看>>
MySQL(四)--练习题
查看>>
高效掌握C#第五回---猜单词游戏
查看>>
07-Java 中的IO操作
查看>>