ling操作
1.扩张 操作表达式
public static class Sample01Extensions
{
public static Quote MinPrice(this IEnumerable<Quote> source)
{
return source.Aggregate((t, s) => t.Price < s.Price ? t : s);
}
public static TSouce MinItem<TSouce, TCompareValue>(this IEnumerable<TSouce> source,
Func<TSouce, TCompareValue> comparerExpression)
{
var comparer = Comparer<TCompareValue>.Default;
return source.Aggregate((minValue, item) =>
{
var result = comparer.Compare(comparerExpression(minValue), comparerExpression(item));
return result < 0 ? minValue : item;
});
}
}
使用:
var minQuote = stock.Quotes.MinItem(q => q.Date);
2.特化操作符: where
public static class Sample02Extensions
{
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate) where TSource : IVisible//约束
{
return Enumerable.Where(source, item => item.Visible == true && predicate(item));
}
}
3.plinq 并行
一台咖啡机,队伍拆开,两排,交替使用(并发)
两台咖啡机 并行
多线程
并行 VS 串行
private static void ParallerTest01()
{
var watch = Stopwatch.StartNew();
watch.Start();
Run1();
Run2();
Console.WriteLine("串行耗时:{0}", watch.ElapsedMilliseconds);
watch.Restart();
Parallel.Invoke(Run1, Run2);
Console.WriteLine("并行耗时:{0}", watch.ElapsedMilliseconds);
Console.Read();
}
---------
private static void ParallerTest02()
{
for (var j = 1; j < 5; j++)
{
Console.WriteLine("第{0}次循环", j);
#region 并行
//ConcurrentBag 与list 的区别是 list是线程不安全
var bag = new ConcurrentBag<int>();
var watch = Stopwatch.StartNew();
watch.Start();
Parallel.For(0, 20_000_000, i =>
{
bag.Add(i);
});
Console.WriteLine($"并行耗时:{watch.ElapsedMilliseconds}");
#endregion
#region 串行
var bag1 = new ConcurrentBag<int>();
watch = Stopwatch.StartNew();
watch.Start();
for (var i = 0; i < 20_000_000; i++)
{
bag1.Add(i);
}
Console.WriteLine($"串行耗时:{watch.ElapsedMilliseconds}");
#endregion
}
}
-------------PLINQ使用----
private static void Sample04()
{
var students = new ConcurrentDictionary<int, Student>();
// 并行生成1000万条数据
Parallel.For(0, 10_000_000, (i) =>
{
var single = new Student
{
Id = i,
Name = "name" + i,
Age = i % 100,
CreateTime = DateTime.Now.AddSeconds(i)
};
students.TryAdd(i, single);
});
Console.WriteLine("数据已生成");
// PLINQ查询
var watch = new Stopwatch();
watch.Start();
var query1 = (from n in students.Values.AsParallel()
.WithDegreeOfParallelism(Environment.ProcessorCount-2)//保留两个核心数
where n.Age > 18 && n.Age < 80
select n).ToList();
watch.Stop();
Console.WriteLine("PLINQ耗时:{0}", watch.ElapsedMilliseconds);
// LINQ查询
watch.Restart();
var query2 = (from n in students.Values
where n.Age > 18 && n.Age < 80
select n).ToList();
watch.Stop();
Console.WriteLine("LINQ耗时:{0}", watch.ElapsedMilliseconds);
}
-------------
private static void LinqTread()
{
var students = new ConcurrentDictionary<int, Student>();
Parallel.For(0, 10, (i) =>
{
var single = new Student
{
Id = i,
Name = "name" + i,
Age = i % 100,
CreateTime = DateTime.Now.AddSeconds(i)
};
students.TryAdd(i, single);
});
Console.WriteLine("数据生成结束");
// 测试PLNQ与LINQ查询
var query = from n in students.Values.AsParallel()
select new {Name = n.Name, ThreadId = Thread.CurrentThread.ManagedThreadId};
foreach (var o in query)
{
Console.WriteLine($"{o} - from ThreadId = {Thread.CurrentThread.ManagedThreadId}");
}
Console.WriteLine($"CurrentThreadId:{Thread.CurrentThread.ManagedThreadId}");
}
----------MAP reduce----统计词频
public static void Sample05()
{
var words = File.ReadAllText("Data.txt").Split(' ');
var map = words.AsParallel().ToLookup(p => p, k => 1);
var reduce = from IGrouping<string, int> wordMap in map.AsParallel()
where wordMap.Count() > 1
select new {Word = wordMap.Key, Count = wordMap.Count()};
foreach (var word in reduce)
{
Console.WriteLine($"Word: {word.Word},Count:{word.Count}");
}
}

浙公网安备 33010602011771号