Lookup<TKey, TElement>
- 把键映射到,一个值的集合上
- 不能像字典那样创建,必须调用
ToLookup()方法来创建Lookup<TKey, TElement> IEnumerable<T>类型,都可以调用ToLookup()ToLookup()接收一个参数Func<TSource, TKey>- 选择
IEnumerable<T>的T的属性 - 来作为
Lookup<TKey, TElement>的TKey
- 选择
class Program
{
static void Main()
{
var racers = new List<Racer>();
racers.Add(new Racer(26, "Jacques", "Villeneuve", "Canada", 11));
racers.Add(new Racer(18, "Alan", "Jones", "Australia", 12));
racers.Add(new Racer(11, "Jackie", "Stewart", "United Kingdom", 27));
racers.Add(new Racer(15, "James", "Hunt", "United Kingdom", 10));
racers.Add(new Racer(5, "Jack", "Brabham", "Australia", 14));
var lookupRacers = racers.ToLookup(r => r.Country);
foreach (Racer r in lookupRacers["Australia"])
{
Console.WriteLine(r);
}
}
}
输出:
Alan Jones
Jack Brabham
其中:
public class Racer : IComparable<Racer>, IFormattable
{
public Racer(int id, string firstName, string lastName, string country, int wins)
{
Id = id;
FirstName = firstName;
LastName = lastName;
Country = country;
Wins = wins;
}
public Racer(int id, string firstName, string lastName, string country)
: this(id, firstName, lastName, country, wins: 0)
{ }
public int Id { get; }
public string FirstName { get; }
public string LastName { get; }
public string Country { get; }
public int Wins { get; set; }
public override string ToString() => $"{FirstName} {LastName}";
public string ToString(string format, IFormatProvider formatProvider)
{
if (format == null) format = "N";
switch (format.ToUpper())
{
case null:
case "N": // name
return ToString();
case "F": // first name
return FirstName;
case "L": // last name
return LastName;
case "W": // Wins
return $"{ToString()}, Wins: {Wins}";
case "C": // Country
return $"{ToString()}, Country: {Country}";
case "A": // All
return $"{ToString()}, {Country} Wins: {Wins}";
default:
throw new FormatException(String.Format(formatProvider,
"Format {0} is not supported", format));
}
}
public string ToString(string format) => ToString(format, null);
public int CompareTo(Racer other)
{
if (other == null) return -1;
int compare = string.Compare(LastName, other.LastName);
if (compare == 0)
return string.Compare(FirstName, other.FirstName);
return compare;
}
}