一、List的扩展
前言
List的三个扩展方法
1.处理符合in()格式的扩展方法
2.处理符合SelectListItem类型的扩展方法(SelectListItem类型是下拉框要用到的类型)
3.Distinct方法的进一步扩展(如果列表里的值是对象,Distinct就不能通过对象里的字段进行筛选,扩展之后就可以实现)
操作
第一个扩展方法:处理符合in()格式的扩展方法
第一步,这里只是提供整数、字符串两种格式的扩展方法。
处理字符串的扩展方法,代码如下:
public static string ToStringList(this IEnumerable<string> listItems) { string strArray = ""; foreach (var item in listItems) { strArray += string.Format(",'{0}'", item); } if (strArray.Length > 0) { strArray = strArray.Substring(1); } return strArray; }
处理整数的扩展方法,代码如下:
public static string ToStringList(this IEnumerable<int> listItems) { string strArray = ""; foreach (var item in listItems) { strArray += string.Format(",{0}", item); } if (strArray.Length > 0) { strArray = strArray.Substring(1); } return strArray; }
第二步,扩展方法以及实现,接下来定义一个List,代码如下:
List<Studens> list = new List<Studens>(); for (int i = 0; i < 10; i++) { Studens studens = new Studens() { Id=1+i, Age = 23+i, Name = "大侠" }; list.Add(studens); }
第三步,实现,代码如下:
var age = list.Select(c => c.Age); string strAge = age.ToStringList();//扩展方法ToStringList的用法 var name = list.Select(c => c.Name); string strName = name.ToStringList();//扩展方法ToStringList的用法
注意
说到注意就一定得注意,不然就会吃苦。
注意:不能用参数化给in()操作符赋值,可以用字符串并接
******************第一个扩展方法介绍结束***********************
第二个扩展方法:处理符合SelectListItem类型的扩展方法
第一步:扩展方法,代码如下:
public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> reusltItems, Func<T, int> valueProperty, Func<T, string> textProperty) { return reusltItems.Select(c => new SelectListItem { Value = valueProperty(c).ToString(), Text = textProperty(c), }).ToList(); }
第二步:实现,代码如下:(list定义按照第一个扩展方法)
List<SelectListItem> listItme = list.ToSelectList(c => c.Id, c => c.Name);
******************第二个扩展方法介绍结束***********************
第三个扩展方法:Distinct方法的进一步扩展
第一步:定义一个类,代码如下:
public class CommonEqualityComparer<T, V> : IEqualityComparer<T> { private Func<T, V> keySelector; private IEqualityComparer<V> comparer; public CommonEqualityComparer(Func<T, V> keySelector, IEqualityComparer<V> comparer) { this.keySelector = keySelector; this.comparer = comparer; } public CommonEqualityComparer(Func<T, V> keySelector) : this(keySelector, EqualityComparer<V>.Default) { } public bool Equals(T x, T y) { return comparer.Equals(keySelector(x), keySelector(y)); } public int GetHashCode(T obj) { return comparer.GetHashCode(keySelector(obj)); } }
第二步:实现扩展方法,代码如下:
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector) { return source.Distinct(new CommonEqualityComparer<T, V>(keySelector)); } public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector, IEqualityComparer<V> comparer) { return source.Distinct(new CommonEqualityComparer<T, V>(keySelector, comparer)); }
第三步:实现,代码如下:(list定义按照第一个扩展方法)
var listDis = list.Distinct(p => p.Name).ToArray();
******************第三个扩展方法介绍结束***********************
结尾
在实际的开发中,扩展方法既简单又快速,还挺有规范,值得在开发中积累下来。