C#.NET IEnumerable扩展 ToDataTable/ToPage/ToJson/ForEach/In/Do/Slice

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data;
using System.Data.Common;
using System.Web.Script.Serialization;
using System.IO;
using System.Security.Cryptography;
using System.Collections;
using System.Collections.ObjectModel;

namespace Pub.Class {
   
public static class IEnumerableExtensions {

       
public static bool IsNullEmpty(this IEnumerable source) {
           
if (source == null) return true;
           
foreach (var item in source) return false;
           
return true;
        }
       
public static DataTable ToDataTable<T>(this IEnumerable<T> varlist) {
            DataTable dtReturn
= new DataTable();
PropertyInfo[] oProps
= null;
           
if (varlist == null) return dtReturn;

           
foreach (T rec in varlist) {
               
if (oProps == null) {
                    oProps
= ((Type)rec.GetType()).GetProperties();
                   
foreach (PropertyInfo pi in oProps) {
                        Type colType
= pi.PropertyType;
                       
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable <>))) colType = colType.GetGenericArguments()[0];
                        dtReturn.Columns.Add(
new DataColumn(pi.Name, colType));
                    }
                }
                DataRow dr
= dtReturn.NewRow();
               
foreach (PropertyInfo pi in oProps) dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
                dtReturn.Rows.Add(dr);
            }
           
return dtReturn;
        }
       
public static List<TSource> ToPage<TSource>(this IEnumerable<TSource> varlist, int pageIndex,int pageSize,out int totalRecords) {
            totalRecords
= varlist.Count();
           
return varlist.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
        }
       
public static string ToJson<TSource, TResult>(this IEnumerable<TSource> varlist, Func<TSource, TResult> selector) {
           
return varlist.Select(selector).ToJson();
        }

       
public static IEnumerable<TTarget> ConvertList<TSource, TTarget>(this IEnumerable<TSource> source) {
           
foreach(var value in source) {
               
yield return value.ConvertTo<TTarget>();
            }
        }
       
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action) {
           
foreach (T element in source) {
                action(element);
               
yield return element;
            }
        }
       
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> items, Action<T> odd, Action<T> even) {
           
bool isOdd = true;
           
return ForEach(items, item => {
               
if (isOdd) odd(item); else even(item);
                isOdd
= !isOdd;
            });
        }
       
public static IEnumerable<T> MergeWith<T>(this IEnumerable<T> target, params IEnumerable<T>[] data) {
            List
<T> list = new List<T>( target );
            data.ForEach( array
=> list.AddRange( array ) );
           
return list;
        }
       
public static IEnumerable<T> With<T>(this IEnumerable<T> source, T item) {
           
foreach (T t in source) yield return t;
           
yield return item;
        }
       
public static bool ContainsAtLeast<T>(this IEnumerable<T> enumeration, int count) {
           
if (enumeration == null) throw new ArgumentNullException("enumeration");
           
return (from t in enumeration.Take(count) select t).Count() == count;
        }
       
public static IEnumerable<T[]> GroupEvery<T>(this IEnumerable<T> enumeration, int count) {
           
if (enumeration == null) throw new ArgumentNullException("IEnumerable cannot be null.");
           
if (count <= 0) throw new ArgumentOutOfRangeException("The count parameter must be greater than zero.");
           
int current = 0;
            T[] array
= new T[count];
           
foreach (var item in enumeration) {
                array[current
++] = item;
               
if (current == count) {
                   
yield return array;
                    current
= 0;
                    array
= new T[count];
                }
            }
           
if (current != 0) yield return array;
        }
       
public static int IndexOf<T>(this IEnumerable<T> enumeration, T value) where T : IEquatable<T> {
           
return enumeration.IndexOf<T>(value, EqualityComparer<T>.Default);
        }
       
public static int IndexOf<T>(this IEnumerable<T> enumeration, T value, IEqualityComparer<T> comparer) {
           
int index = 0;
           
foreach (var item in enumeration) {
               
if (comparer.Equals(item, value)) return index;
                index
++;
            }
           
return -1;
        }
       
public static int IndexOf<T>(this IEnumerable<T> enumeration, T value, int startIndex) where T : IEquatable<T> {
           
return enumeration.IndexOf<T>(value, startIndex, EqualityComparer<T>.Default);
        }
       
public static int IndexOf<T>(this IEnumerable<T> enumeration, T value, int startIndex, IEqualityComparer<T> comparer) {
           
for (int i = startIndex; i < enumeration.Count(); i++) {
                T item
= enumeration.ElementAt(i);
               
if (comparer.Equals(item, value)) return i;
            }
           
return -1;
        }
       
public static int IndexOfPrevious<T>(this IEnumerable<T> items, T value, int fromIndex) {
           
for (int i = fromIndex - 1; i > -1; i--) {
                T item
= items.ElementAt(i);
               
if (EqualityComparer<T>.Default.Equals(item, value)) return i;
            }
           
return -1;
        }
       
public static bool Contains<T>(this IEnumerable<T> items, T value) {
           
if (items == null) throw new ArgumentNullException("items");

            ICollection
<T> c = items as ICollection<T>;
           
if (c != null) return c.Contains(value);

           
throw new NotImplementedException();
        }

       
public static T Constructor<T>(this IEnumerable<object> Parameters, IDictionary<string, object> Properties) where T: class {
            Type ttype
= typeof(T);
            T obj
= (T)Activator.CreateInstance(typeof(T), Parameters);
           
foreach (string key in Properties.Keys) {
                PropertyInfo prop
= ttype.GetProperty(key);
               
if (prop != null) prop.SetValue(obj, Properties[key], null);
            }
           
return obj;
        }

       
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> inputs, Func<T, IEnumerable<T>> enumerate) {
           
if (inputs != null) {
                var stack
= new Stack<T>(inputs);
               
while (stack.Count > 0) {
                    var current
= stack.Pop();
                   
if (current == null) continue;
                   
yield return current;
                    var enumerable
= enumerate != null ? enumerate(current) : null;
                   
if (enumerable != null) {
                       
foreach (var child in enumerable) stack.Push(child);
                    }
                }
            }
        }
       
public static IEnumerable Flatten(this IEnumerable inputs, Func<object, System.Collections.IEnumerable> enumerate) {
           
return Flatten<object>(inputs.Cast<object>(), o => (enumerate(o) ?? new object[0]).Cast<object>());
        }

       
public static ReadOnlyCollection<T> AsReadOnly<T>(this IEnumerable<T> @this) {
           
return new ReadOnlyCollection<T>(new List<T>(@this));
        }

       
public static bool In<T>(this T source, IEnumerable<T> values) where T : IEquatable<T> {
           
if (values == null) return false;

           
foreach (T listValue in values) {
               
if ((default(T).Equals(source) && default(T).Equals(listValue)) || (!default(T).Equals(source) && source.Equals(listValue))) return true;
            }

           
return false;
        }

       
public static IEnumerable<TSource> Do<TSource>(this IEnumerable<TSource> source, Action<TSource> action) {
           
foreach (var x in source) action(x);
           
return source;
        }
       
public static IEnumerable Do(this IEnumerable source, Action<object> action) {
           
foreach (var x in source) action(x);
           
return source;
        }
       
public static IEnumerable<TSource> Do<TSource>(this IEnumerable<TSource> source, Action<TSource, int> action) {
            var i
= 0;
           
foreach (var x in source) action(x, i++);
           
return source;
        }
       
public static IEnumerable Do(this IEnumerable source, Action<object, int> action) {
            var i
= 0;
           
foreach (var x in source) action(x, i++);
           
return source;
        }

       
public static IEnumerable<TSource> Concat<TSource>(this IEnumerator<TSource> left, IEnumerator<TSource> right) {
           
while (left.MoveNext()) yield return left.Current;
           
while (right.MoveNext()) yield return right.Current;
        }
       
public static IEnumerable<TSource> Concat<TSource>(this IEnumerator<TSource> left, TSource last) {
           
while (left.MoveNext()) yield return left.Current;
           
yield return last;
        }
       
public static IEnumerable<TSource> Concat<TSource>(this TSource first, IEnumerator<TSource> right) {
           
yield return first;
           
while (right.MoveNext()) yield return right.Current;
        }

       
public static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> source, int size) {
           
int index = 1;
            IEnumerable
<T> partition = source.Take(size).AsEnumerable();
           
while (partition.Any()) {
               
yield return partition;
                partition
= source.Skip(index++ * size).Take(size).AsEnumerable();
            }
        }

       
public static IEnumerable<T> Slice<T>(this IEnumerable<T> source, int? start) { return Slice<T>(source, start, null, null); }

       
public static IEnumerable<T> Slice<T>(this IEnumerable<T> source, int? start, int? stop) { return Slice<T>(source, start, stop, null); }

       
public static IEnumerable<T> Slice<T>(this IEnumerable<T> source, int? start, int? stop, int? step) {
           
if (source == null) throw new ArgumentNullException("source");
           
if (step == 0) throw new ArgumentException("Step cannot be zero.", "step");

            IList
<T> sourceCollection = source as IList<T>;
           
if (sourceCollection == null)
            sourceCollection
= new List<T>(source);

           
// nothing to slice
            if (sourceCollection.Count == 0) yield break;

           
// set defaults for null arguments
            int stepCount = step ?? 1;
           
int startIndex = start ?? ((stepCount > 0) ? 0 : sourceCollection.Count - 1);
           
int stopIndex = stop ?? ((stepCount > 0) ? sourceCollection.Count : -1);

           
// start from the end of the list if start is negitive
            if (start < 0) startIndex = sourceCollection.Count + startIndex;

           
// end from the start of the list if stop is negitive
            if (stop < 0) stopIndex = sourceCollection.Count + stopIndex;

           
// ensure indexes keep within collection bounds
            startIndex = Math.Max(startIndex, (stepCount > 0) ? 0 : int.MinValue);
            startIndex
= Math.Min(startIndex, (stepCount > 0) ? sourceCollection.Count : sourceCollection.Count - 1);
            stopIndex
= Math.Max(stopIndex, -1);
            stopIndex
= Math.Min(stopIndex, sourceCollection.Count);

           
for (int i = startIndex; (stepCount > 0) ? i < stopIndex : i > stopIndex; i += stepCount) yield return sourceCollection[i];

           
yield break;
        }
    }
}

 

ToJson调用实例:

  
  
private void loadlp(){
IList
< LP_Task > list = LP_TaskFactory.Instance().SelectListByCustomerID(Customer.CustomerID.Value, "" , "" , "" , true ).Where(p => p.JobID == CurrentUser.Job && p.Status == 1 ).OrderByDescending(p => p.Quarter).ToList();
string data = list.ToJson(p => new {
id
= p.TaskID,
title
= p.TaskName,
text
= p.Intro,
quarter
= p.Quarter,
abilitys
= LP_TaskAbilityFactory.Instance().SelectListByTaskID(p.TaskID.Value, "" , "" , "" , true ).Select(z => new {
id
= z.AbilityID,
level
= z.LPLevel,
info
= LP_AbilityFactory.Instance().SelectListByCustomerID(CurrentUser.CustomerID.Value, "" , "" , "" , true )
.Where(y
=> y.AbilityID == z.AbilityID).ToList()
.Select(y
=> new { y.Ability, LevelText = (z.LPLevel == 1 ? y.Level1Intro : z.LPLevel == 2 ? y.Level2Intro : y.Level3Intro) }).FirstOrDefault()
}),
nodes
= LP_TaskDetailFactory.Instance().SelectListByTaskID(p.TaskID.Value, "" , "" , "" , true ).Select(d => new { d.DetailMonths, d.DetailName, d.DetailType, d.DetailIntro, d.Days })
});
Msg.WriteEnd(data);
}

 

linq 递归

 

  
  
public IEnumerable GetCourseSeriesTree3( int parentID) {
IList
< CC_CourseSeries > list = CC_CourseSeriesFactory.Instance().SelectCourseSeriesListByCustomerID(( int )CurrentUser.CustomerID, true );
var list2
= list.Where(p => p.ParentID == parentID).Select(p => new {
id
= p.SeriesID,
name
= p.SeriesName.UnHtml(),
node
= GetCourseSeriesTree3(( int )p.SeriesID)
});
return list2;
}
public IEnumerable GetCourseSeriesTree( int parentID) {
IList
< CC_CourseSeries > list = CC_CourseSeriesFactory.Instance().SelectCourseSeriesListByCustomerID(( int )CurrentUser.CustomerID, true );
return FuncExtensions.Fix < int , IEnumerable > (f => p => {
var list2
= list.Where(o => o.ParentID == p).Select(o => new {
id
= o.SeriesID,
name
= o.SeriesName.UnHtml(),
node
= f(( int )o.SeriesID)
});
return list2;
})(parentID);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值