1. 程式人生 > 實用技巧 >(精華)2020年9月6日 C#基礎知識點 Linq的使用場景

(精華)2020年9月6日 C#基礎知識點 Linq的使用場景

(精華)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));
        }
    }
}