(精華)2020年9月6日 C#基礎知識點 Linq的使用場景
阿新 • • 發佈:2020-12-30
(精華)2020年9月6日 C#基礎知識點 Linq的使用場景
一:比較返回當前專案
namespace LinqSample {<!-- --> public class Quote {<!-- --> public Stock Stock {<!-- --> get; set; } public decimal Price {<!-- --> get; set; } public DateTime Date {<!-- --> get; set; } } public class Stock {<!-- --> public string Name {<!-- --> get; set; } public List<Quote> Quotes {<!-- --> get; set; } public override string ToString() {<!-- --> return $"{Name}: MIN {Quotes.Min(q => q.Price)} - MAX {Quotes.Max(q => q.Price)}"; } } public partial class Program {<!-- --> private static void Sample01() {<!-- --> var stock = new Stock {<!-- -->Name = "Stock Demo"}; stock.Quotes = new List<Quote> {<!-- --> new Quote{<!-- -->Stock = stock, Price = 200, Date = DateTime.Parse("2020/3/29")}, new Quote{<!-- -->Stock = stock, Price = 150, Date = DateTime.Parse("2020/3/21")}, new Quote{<!-- -->Stock = stock, Price = 220, Date = DateTime.Parse("2020/3/23")}, new Quote{<!-- -->Stock = stock, Price = 180, Date = DateTime.Parse("2020/3/25")}, new Quote{<!-- -->Stock = stock, Price = 100, Date = DateTime.Parse("2020/3/26")}, }; Console.WriteLine( $"Stock: {stock}"); var minQuote = stock.Quotes.MinItem(q => q.Date); Console.WriteLine(minQuote.Price); } } public static class Sample01Extensions {<!-- --> public static Quote MinPrice(this IEnumerable<Quote> source) {<!-- --> //Aggregate累加器函式 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; }); } } }
二:改寫擴充套件where,自定義預設條件返回
namespace LinqSample {<!-- --> public interface IVisible {<!-- --> bool Visible {<!-- --> get; set; } } public class Customer : IVisible {<!-- --> public string Name {<!-- --> get; set; } public int Age {<!-- --> get; set; } public bool Visible {<!-- --> get; set; } public Customer() {<!-- --> Visible = true; } public override string ToString() {<!-- --> return $"{Name} 今年 {Age} 歲了"; } } public partial class Program {<!-- --> private static void Sample02() {<!-- --> var customers = new List<Customer> {<!-- --> new Customer{<!-- -->Name = "張三", Age = 20, Visible = false}, new Customer{<!-- -->Name = "李四", Age = 18}, new Customer{<!-- -->Name = "王五", Age = 22}, }; var query = from c in customers where c.Age < 22 select c; foreach (var customer in query) {<!-- --> Console.WriteLine(customer); } } } 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)); } } }