自己做的一些查询有错误。
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sample.LINQ
{
public class MainEntryPoint
{
static int Main(string[] args)
{
//LinqQuery();
/*var names = new List<string>{ "Nino", "Alberto", "Juan", "Mike", "Phil"};
var nameWithJ = from n in names
where n.StartsWith("J")
orderby n
select n;
Console.Write("Before:");
foreach(string n in nameWithJ)
{
Console.Write(" "+n);
}
names.Add("John");
names.Add("Jack");
names.Add("Jim");
Console.WritLine();
Console.Write("After:");
foreach(string n in nameWithJ)
{
Console.Write(" "+n);
}*/
/*var names = new List<string>{ "Nino", "Alberto", "Juan", "Mike", "Phil"};
var nameWithJ = (from n in names
where n.StartsWith("J")
orderby n
select n).ToList();
Console.Write("Before:");
foreach(string n in nameWithJ)
{
Console.Write(" "+n);
}
names.Add("John");
names.Add("Jack");
names.Add("Jim");
Console.WritLine();
Console.Write("After:");
foreach(string n in nameWithJ)
{
Console.Write(" "+n);
}*/
/*var racers = from r in Formula1.GetRacers()
where (r.Wins > 15) && (r.Country == "USA" || r.Country == "UK")
select r;
foreach(Racer r in racers)
{
Console.WriteLine("{0:A}", r);
}*/
/*var racers = Formula1.GetRacers().
Where( r => (r.Wins > 15) && (r.Country == "USA" || r.Country =="UK")).
Select( r => r);
foreach(Racer r in racers)
{
Console.WriteLine("{0:A}", r);
}*/
/*var racers = Formula1.GetRacers().
Where( (r, index) => r.LastName.StartsWith("A") && index % 2 == 0).
Select( r => r);
foreach(Racer r in racers)
{
Console.WriteLine("{0:A}", r);
}*/
/*object[] data ={ 123, "abc", 456, "def"};
var query = data.OfType<string>();
foreach(var s in query)
{
Console.WriteLine(s);
}*/
/*var query = from r in Formula1.GetRacers()
from c in r.Cars
where c == "Ferrari"
select r.LastName+" "+r.FirstName;
foreach(string s in query)
{
Console.WriteLine(s);
}*/
/*var result = Formula1.GetRacers().
SelectMany(r => r.Cars, (r, c) => new{ Racer = r, Car = c}).
Where( r => r.Car = "Ferrari").
Select(r => r.FirstName+" "+r.LastName);
foreach(string s in result)
{
Console.WriteLine(s);
}*/
/*var racers = from r in Formula1.GetRacers()
where r.Country == "UK"
orderby r.Wins descending
select r;*/
/*var racers = Formula1.GetRacers().
Where( r => r.Country == "UK").
OrderByDescending(r => r.Wins).
Select(r => r);*/
/*var racers = from r in Formula1.GetRacers()
orderby r.Country, r.FirstName, r.LastName
select r;
var racers = Formula1.GetRacers().
OrderBy(r => r.Country).
ThenBy( r => r.FirstName).
ThenBy( r => r.LastName).
Select( r => r);*/
/*var query = from r in Formula1.GetRacers()
group r by r.Country into g
orderby g.Count() descending, g.Key
where g.Count() >= 2
select new{
Count = g.Count(),
Country = g.Key
};
var query = Formula1.GetRacers().
GroupBy( r => r.Country).
OrderBy( g => g.Count()).
ThenBy( g => g.Key).
Where( g => g.Count() >= 2).
Select( g => new {Country = g.Key, Count = g.Count()});
foreach(var i in query)
{
Console.WriteLine("{0} {1}",i.Country , i.Count);
}*/
/*var result = from r in Formula1.GetRacers()
group r by r.Country into g
orderby g.Count() descending,g.Key
where g.Count() >= 2
select new
{
Count = g.Count(),
Country = g.Key,
Racers = from r1 in g
orderby r1.LastName
select r1.FirstName+" "+r1.LastName
};
foreach(var i in result)
{
Console.WriteLine("{0,-10} {1}",i.Country, i.Count);
foreach(var r in i.Racers)
{
Console.WriteLine(r);
}
}*/
/*var racers = from r in Formula1.GetRacers()
from y in r.Years
select new{
Year = y,
Name = r.FirstName+" "+r.LastName
};
var teams = from t in Formula1.GetTeams()
from y in t.Years
select new{
Name = t.Name,
Year = y
};
var result = from r in racers
join t in teams on r.Year equals t.Year
select new{
r.Year,
TeamName = t.Name,
Name = r.Name
};*/
/*var racers = from r in Formula1.GetRacers()
from y in r.Years
select new{
Year = y,
Name = r.FirstName+" "+r.LastName
};
var teams = from t in Formula1.GetTeams()
from y in t.Years
select new{
Name = t.Name,
Year = y
};
var result = from r in racers
join t in teams on r.Year equals t.Year into rt
from t in rt.DefaultIfEmpty()
orderby r.Year
select new{
r.Year,
TeamName = t==null ? "no team":t.Name,
Name = r.Name
};
foreach(var i in result)
{
Console.WriteLine("{0} {1} {2}",i.TeamName, i.Name, i.Year);
}*/
//有错误
/*var racersList = Formula1.GetRacerTeamShip().
SelectMany( rts => new List<RacerInfo>()
{
new RacerInfo{
Year = rts.Year,
Position = 1,
FirstName = rts.First.FirstName(),
LastName = rts.First.LastName()
},
new RacerInfo{
Year = rts.Year,
Position = 2,
FirstName = rts.Second.FirstName(),
LastName = rts.Second.LastName()
},
new RacerInfo{
Year = rts.Year,
Position = 3,
FirstName = rts.Third.FirstName(),
LastName = rts.Third.LastName()
}
});
var result = from r in Formula1.GetRacers()
join r2 in racersList
on
new
{
FirstName = r.FirstName,
LastName = r.LastName
}
equals
new
{
FirstName = r2.FirstName,
LastName = r2.LastName
}
into yearResults
select new
{
FirstName = r.FirstName,
LastName = r.LastName,
Wins = r.Wins,
Starts = r.Starts,
Result = yearResults
};
foreach(var i in result)
{
Console.WriteLine("{0} {1}", i.FirstName, i.LastName);
foreach(var j in i.Results)
{
Console.WriteLine("{0} {1}",j.Year, j.Position);
}
}*/
/*foreach(var i in racersList)
{
Console.WriteLine("{0} {1} {2} {3}", i.Year, i.FirstName, i.LastName, i.Position);
}*/
/*var ferrariDrivers = from r in Formula1.GetRacers()
from c in r.Cars
where c == "Ferrari"
select r;*/
/*var ferrariDrivers = GetRacersByCar("Ferrari");
Func<string, IEnumerable<Racer>> racersByCar = car
=> from r in Formula1.GetRacers()
from c in r.Cars
where c == car
select r;
foreach(Racer r in ferrariDrivers.Intersect(racersByCar("Alfa Romeo")))
{
Console.WriteLine("{0:A}", r);
}*/
/*var racersName = from r in Formula1.GetRacers()
where r.Country == "UK"
orderby r.Wins descending
select new
{
Name = r.FirstName + " "+r.LastName
};
var racersNameAndStarts = from r in Formula1.GetRacers()
where r.Country == "UK"
orderby r.Wins descending
select new
{
LastName = r.LastName,
Starts = r.Starts
};
var racers = racersName.Zip(racersNameAndStarts, (first, second) => first.Name + " ,Starts:"+second.Starts);
foreach(var i in racers)
{
Console.WriteLine(i);
}*/
/*int pagesize = 2;
int numberPages = (int)Math.Ceiling(Formula1.GetRacers().Count()/(double)(pagesize));
for(int i = 0; i < numberPages ; i++)
{
Console.WriteLine("Page {0}:",i);
var racers = (from r in Formula1.GetRacers()
orderby r.LastName, r.FirstName
select r.FirstName + " " +r.LastName).
Skip(pagesize * i).Take(pagesize);
foreach(var name in racers)
{
Console.WriteLine(name);
}
}*/
/*var query = from r in Formula1.GetRacers()
let yearsCount = r.Years.Count()
where yearsCount >= 1
orderby yearsCount descending, r.LastName
select new
{
Name = r.FirstName + " " +r.LastName,
YearsCount = yearsCount
};
foreach(var i in query)
{
Console.WriteLine(i.Name+" "+i.YearsCount);
}*/
/*var query = (from x in
(from r in Formula1.GetRacers()
group r by r.Country into c
select new
{
Country = c.Key,
Wins = (from r1 in c
select r1.Wins).Sum()
})
orderby x.Wins descending, x.Country
select x).Take(3);
foreach(var i in query)
{
Console.WriteLine(i.Country+" "+i.Wins);
}*/
/*List<Racer> list = (from r in Formula1.GetRacers()
where r.Starts > 20
orderby r.Starts descending
select r).ToList();
foreach(Racer r in list)
{
Console.WriteLine("{0:A}", r);
}*/
/*var query = (from r in Formula1.GetRacers()
from c in r.Cars
select new
{
Car = c,
Racer = r
}).ToLookup( r => r.Car, r => r.Racer);
if(query.Contains("Ferrari"))
{
foreach(var i in query["Ferrari"])
{
Console.WriteLine("{0:A}",i);
}
}*/
var list = new System.Collections.ArrayList(Formula1.GetRacers() as System.Collections.ICollection);
var query = from r in list.Cast<Racer>()
where r.Country == "UK"
orderby r.Wins descending
select r;
foreach(Racer r in query)
{
Console.WriteLine("{0:A}", r);
}
return 0;
}
private static IEnumerable<Racer> GetRacersByCar(string car)
{
return from r in Formula1.GetRacers()
from c in r.Cars
where c == car
select r;
}
public static void LinqQuery()
{
var query = from r in Formula1.GetRacers()
where r.Country == "UK"
orderby r.Wins descending
select r;
foreach(Racer r in query)
{
Console.WriteLine("{0:A}", r);
}
}
}
public static class StringExtension
{
public static string FirstName(this string name)
{
int ix = name.LastIndexOf(' ');
return name.Substring(0, ix);
}
public static string LastName(this string name)
{
int ix = name.LastIndexOf(' ');
return name.Substring(ix+1);
}
}
[Serializable]
public class RacerInfo
{
public int Year { get; set;}
public int Position { get; set;}
public string FirstName { get; set;}
public string LastName { get; set;}
}
[Serializable]
public class RacerTeamShip
{
public int Year{ get; set;}
public string First { get; set;}
public string Second { get; set;}
public string Third { get; set;}
}
[Serializable]
public class Racer : IComparable<Racer>, IFormattable
{
public string FirstName { get; set;}
public string LastName { get; set;}
public int Wins { get; set;}
public string Country { get; set;}
public int Starts { get; set;}
public IEnumerable<string> Cars { get; private set;}
public IEnumerable<int> Years { get; private set;}
public Racer(string firstName, string lastName, int wins, string country, int starts, IEnumerable<string> cars,IEnumerable<int> years)
{
this.FirstName = firstName;
this.LastName = lastName;
this.Wins = wins;
this.Country = country;
this.Starts = starts;
this.Cars = new List<string>(cars);
this.Years =new List<int>(years);
}
public Racer(string firstName, string lastName, int wins, string country, int starts): this(firstName, lastName, wins, country, starts, null, null)
{
}
public override string ToString()
{
return string.Format("{0} {1}", FirstName, LastName);
}
public int CompareTo(Racer other)
{
if(other == null)
return -1;
return string.Compare(this.LastName, other.LastName);
}
public string ToString(string format)
{
return ToString(format, null);
}
public string ToString(string format, IFormatProvider formatProvider)
{
switch(format)
{
case null:
case "N":
return ToString();
case "F":
return FirstName;
case "L":
return LastName;
case "C":
return Country;
case "S":
return Starts.ToString();
case "W":
return Wins.ToString();
case "A":
return string.Format("{0} {1}, {2}, starts: {3}, wins: {4}", FirstName, LastName, Country, Starts, Wins);
default:
throw new FormatException(string.Format("Format {0} not supported", format));
}
}
}
[Serializable]
public class Team
{
public string Name { get; private set;}
public IEnumerable<int> Years { get; private set;}
public Team(string name, params int[] years)
{
this.Name = name;
this.Years = new List<int>(years);
}
}
public static class Formula1
{
private static List<Racer> racers;
public static IList<Racer> GetRacers()
{
if(racers == null)
{
racers = new List<Racer>(40);
racers.Add(new Racer("Nino","Farina", 33,"Italy", 5, new string[]{"Alfa Romeo", "Ferrari"}, new int[] { 1950 } ));
racers.Add(new Racer("Juan Manuel","Fangio", 51,"Argentia", 24, new string[] {"Alfa Romeo", "Ferrari", "Mercedes", "Maserati"}, new int[]{ 1952, 1954, 1955, 1956, 1957 } ));
racers.Add(new Racer("Alberto","Ascari", 32, "Italy", 10, new string[] {"Ferrari"}, new int[] { 1952, 1953 } ));
racers.Add(new Racer("Mike","Hawthron", 45, "UK", 3, new string[] { "Ferrari"}, new int[] { 1961 } ));
racers.Add(new Racer("Phil","Hill", 48,"USA", 3, new string[] { "Ferrari"}, new int[] { 1950 } ));
racers.Add(new Racer("John","Surtees", 111,"UK", 6, new string[] { "Ferrari"}, new int[] { 1954 } ));
racers.Add(new Racer("Jim","Clark", 72,"UK", 25, new string[] { "Lotus"}, new int[] { 1963, 1965 }));
}
return racers;
}
private static List<Team> teams;
public static IList<Team> GetTeams()
{
if(teams == null)
{
teams = new List<Team>()
{
new Team("Vanwall", 1958),
new Team("Cooper", 1959, 1956),
new Team("Ferrai", 1961, 1964, 1975, 1976, 1977, 1979, 1982, 1983, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008),
new Team("BRM", 1962)
};
}
return teams;
}
private static List<RacerTeamShip> racerTeamShips;
public static IEnumerable<RacerTeamShip> GetRacerTeamShip()
{
if(racerTeamShips == null)
{
racerTeamShips = new List<RacerTeamShip>();
racerTeamShips.Add(new RacerTeamShip
{
Year = 1950,
First = "Nino Farina",
Second = "Juan Manuel Fangio",
Third = "Liugi Fagioli"
});
racerTeamShips.Add(new RacerTeamShip
{
Year = 1951,
First = "Juan Manuel Fangio",
Second = "Alberto Ascari",
Third = "Froilan Gonzalez"
});
}
return racerTeamShips;
}
}
}