注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

Extensions for Linq  

2013-06-06 20:39:41|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Extensions - 秒大刀 - 秒大刀 博客
  采用ADO.NET进行数据访问时,通过以下扩展可以更统一的方式进行数据访问:

public static object[] AsEnumerable(this IDataRecord reader)
{
var record = new object[reader.FieldCount];
reader.GetValues(record);
return record;
}

public static IEnumerable<object[]> AsEnumerable(this DbDataReader reader)
{
return from r in reader.Cast<IDataRecord>() select r.AsEnumerable();
}

public static object[] AsEnumerable(this DataRow row)
{
return row.ItemArray;
}


对二维数组进行“平面化”的一维迭代访问:

public static IEnumerable<IEnumerable<T>> AsEnumerable<T>(this T[,] data)
{
if (data == null)
yield break;
for (var i0 = data.GetLowerBound(0); i0 <= data.GetUpperBound(0); i0++)
{
yield return AsEnumerable(data, i0);
}
}

private static IEnumerable<T> AsEnumerable<T>(this T[,] data, int i0)
{
for (var i1 = data.GetLowerBound(1); i1 <= data.GetUpperBound(1); i1++)
{
yield return data[i0, i1];
}
}


确保取出序列中给定个数的元素,多余的丢弃,不足的补齐。增强了Take,和string.PadRight类似:

public static IEnumerable<T> Resize<T>(this IEnumerable<T> data, int count, Func<T> valueFactory = null)
{
int n = 0;
foreach (var d in data.Take(count))
{
n++;
yield return d;
}
for (int i = n; n < count; n++)
yield return valueFactory == null ? default(T) : valueFactory();
}


序列“相等”,是对Enumerable.SequenceEqual的增强,通常对写UnitTest很有帮助:

public static bool AreEqual<T>(this IEnumerable<T> a, IEnumerable<T> b)
{
return Enumerable.SequenceEqual(a, b);
}

public static bool AreEqual<T>(this IEnumerable<IEnumerable<T>> a, IEnumerable<IEnumerable<T>> b)
{
return Enumerable.SequenceEqual(a, b,
new LambdaEqualityComparer<IEnumerable<T>>(AreEqual));
}

public static bool AreEqual(this IEnumerable<KeyValuePair<string, IEnumerable<IEnumerable<string>>>> a, IEnumerable<KeyValuePair<string, IEnumerable<IEnumerable<string>>>> b)
{
return Enumerable.SequenceEqual(a, b,
new LambdaEqualityComparer<KeyValuePair<string, IEnumerable<IEnumerable<string>>>>(
(sa, sb) => sa.Key == sb.Key && AreEqual(sa.Value, sb.Value)));
}


public class LambdaEqualityComparer<T> : EqualityComparer<T>
{
private Func<T, T, bool> equals;
private Func<T, int> getHashCode;

public LambdaEqualityComparer(Func<T, T, bool> equals, Func<T, int> getHashCode = null)
{
this.equals = equals;
this.getHashCode = getHashCode;
}
public override bool Equals(T x, T y) { return this.equals(x, y); }
public override int GetHashCode(T obj) { return getHashCode == null ? obj.GetHashCode() : getHashCode(obj); }
}


读出所有的行文本,和File.ReadAllLines类似:

public static IEnumerable<string> ReadAllLines(this TextReader reader)
{
while (true)
{
var line = reader.ReadLine();
if (line == null)
yield break;
yield return line;
}
}

public static IEnumerable<string> ReadAllLines(this string str, bool containsTerminating = false)
{
if (str == null)
yield break;
using (var reader = new StringReader(str))
{
foreach (var lien in ReadAllLines(reader))
yield return lien;
}
if (containsTerminating)
{
if (str.Length == 0 || str.EndsWith("\n"))
yield return "";
}
}


正则表达式对字符串进行“切片”,这对高级文本处理非常有用。Regex.Split也提供了切片功能,但具体的命中信息会丢失:

/// <summary>
/// 将字符串由正则表达式分割成片段,并标注每段是否匹配
/// </summary>
/// <param name="regex"></param>
/// <param name="input"></param>
/// <returns></returns>
public static IEnumerable<Tuple<bool, string>> Fragment(this Regex regex, string input)
{
if (input == null)
yield break;

int i = 0;
for (var m = regex.Match(input); m.Success; i = m.Index + m.Length, m = m.NextMatch())
{
int len = m.Index - i;
if (len > 0)
yield return Tuple.Create(false, input.Substring(i, len));
yield return Tuple.Create(true, m.Value);
}
if (i < input.Length)
yield return Tuple.Create(false, input.Substring(i));
}


  评论这张
 
阅读(927)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017