一、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;
        }
View Code

 处理整数的扩展方法,代码如下:

 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;
        }
View Code

 第二步,扩展方法以及实现,接下来定义一个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);
            }
View Code

 第三步,实现,代码如下:

var age = list.Select(c => c.Age);
string strAge = age.ToStringList();//扩展方法ToStringList的用法
var name = list.Select(c => c.Name);
string strName = name.ToStringList();//扩展方法ToStringList的用法
View Code

 

 注意

说到注意就一定得注意,不然就会吃苦。

注意:不能用参数化给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();
        }
View Code

 

第二步:实现,代码如下:(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));
        }
    }
View Code

 第二步:实现扩展方法,代码如下:

 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));
        } 
View Code

 第三步:实现,代码如下:(list定义按照第一个扩展方法)

 var listDis = list.Distinct(p => p.Name).ToArray();

******************第三个扩展方法介绍结束***********************

结尾

在实际的开发中,扩展方法既简单又快速,还挺有规范,值得在开发中积累下来。

 

posted @ 2013-12-16 15:46  泷泷  阅读(1164)  评论(0编辑  收藏  举报