您的位置:首页 > 其它

高效的LINQ语句(二)

2017-06-12 17:02 190 查看

Program.cs代码如下:

class Program
{
private static void Main(string[] args)
{
//Sum_All_Scores_Remove_Three_Lowest();
//Grouping();
//Group_By_Age_From_Birthdate();
Title_Of_Longest_Book();
Console.ReadKey();
}

public static void Sum_All_Scores_Remove_Three_Lowest()
{
var scores = "10,5,0,8,10,1,4,0,10,1";
var desiredScoreSum = scores
.Split(',')
.Select(s => int.Parse(s))
.OrderBy(s => s)
.Skip(3)
.Sum();
Console.WriteLine(desiredScoreSum);
}

public static void Grouping()
{
var orders = new List<Order>()
{
new Order {Id = 123, Amount = 29.95m, CustomerId = "Mark", Status = "Delivered"},
new Order {Id = 456, Amount = 45.00m, CustomerId = "Steph", Status = "Refunded"},
new Order {Id = 768, Amount = 32.50m, CustomerId = "Claire", Status = "Delivered"},
new Order {Id = 222, Amount = 300.00m, CustomerId = "Mark", Status = "Delivered"},
new Order {Id = 333, Amount = 465.00m, CustomerId = "Steph", Status = "Awaiting Stock"},
new Order {Id = 333, Amount = 465.00m, CustomerId = "Steph", Status = "Awaiting Stock"},
};

Dictionary<string, List<Order>> ordersByCustomer = OrdersByCustomer(orders);
foreach (var kvp in ordersByCustomer)
{
Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value.Count);
}

//
Dictionary<string, List<Order>> ordersByCustomer2 = orders.GroupBy(o => o.CustomerId).ToDictionary(g => g.Key, g => g.ToList());
foreach (var kvp in ordersByCustomer2)
{
Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value.Count);
}

}
private static Dictionary<string, List<Order>> OrdersByCustomer(List<Order> orders)
{
var dict = new Dictionary<string, List<Order>>();
foreach (var order in orders)
{
if (!dict.ContainsKey(order.CustomerId))
{
dict[order.CustomerId] = new List<Order>();
}
dict[order.CustomerId].Add(order);
}
return dict;
}

public static void Group_By_Age_From_Birthdate()
{
string namesAndAges = "Phillip Do, 10/10/1978; Mony Taing, 11/10/1979; Mason Do, 03/23/2009; Emma Do, 11/09/2010";
var result = namesAndAges
.Split(';')
.Select(n => n.Split(','))
.Select(
n =>
new
{
Name = n[0].Trim(),
DateOfBirth = DateTime.ParseExact(n[1].Trim(), "M/d/yyyy", CultureInfo.InvariantCulture)
})
.OrderByDescending(n => n.DateOfBirth)
.Select(n =>
{
DateTime today = DateTime.Today;
int age = today.Year - n.DateOfBirth.Year;
if (n.DateOfBirth > today.AddYears(-age))
{
age--;
}
return new { Name = n.Name, Age = age };
});

foreach (var item in result)
{
Console.WriteLine(item.Name + "----" + item.Age);
}

}

//---------------------------------------------------------------------------------------------------
public static void Group_By_Age_From_Birthdate_Clean()
{
Func<string, DateTime> parseDob =
dob => DateTime.ParseExact(dob.Trim(), "M/d/yyyy", CultureInfo.InvariantCulture);
Func<DateTime, int> getAge = dateOfBirth =>
{
DateTime today = DateTime.Today;
int age = today.Year - dateOfBirth.Year;
if (dateOfBirth > today.AddYears(-age)) age--;
return age;
};

string namesAndAges =
"Phillip Do, 10/10/1978; Mony Taing, 11/10/1979; Mason Do, 03/23/2009; Emma Do, 11/09/2010";
var result = namesAndAges
.Split(';')
.Select(n => n.Split(','))
.Select(n => new { Name = n[0].Trim(), DateOfBirth = parseDob(n[1].Trim()) })
.OrderByDescending(n => n.DateOfBirth)
.Select(n => new { Name = n.Name, Age = getAge(n.DateOfBirth) });
}

private DateTime ParseDob(string dob)
{
return DateTime.ParseExact(dob.Trim(), "M/d/yyyy", CultureInfo.InvariantCulture);
}

private int GetAge(DateTime dateOfBirth)
{
DateTime today = DateTime.Today;
int age = today.Year - dateOfBirth.Year;
if (dateOfBirth > today.AddYears(-age))
{
age--;
}
return age;
}
//---------------------------------------------------------------------------------------------------
public static void Title_Of_Longest_Book()
{
var books = new[]
{
new {Author = "Robert Martin", Title = "Clean Code", Pages = 464},
new {Author = "Oliver Sturm", Title = "Functional Programming in C#", Pages = 270},
new {Author = "Martin Fowler", Title = "Patterns of Enterprise Application Architecture", Pages = 533},
new {Author = "Bill Wagner", Title = "Effective C#", Pages = 328}
};

var mostPages = books.Max(x => x.Pages);
var result1 = books.First(b => b.Pages == mostPages);
var result2 = books.OrderByDescending(b => b.Pages).First();

// 最好性能
var result3 = books.Aggregate((agg, next) => next.Pages > agg.Pages ? next : agg);
Console.WriteLine(result3.Title);
}

}

Model层:

public class Entities
{
public string Name { get; set; }
public List<string> Pets { get; set; }
}

public class Order
{
public int Id { get; set; }
public decimal Amount { get; set; }
public string CustomerId { get; set; }
public string Status { get; set; }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: