LINQ
Lambda
Børre Stenseth
Moduler>LINQ>Lambda

Lambda funksjoner

Hva
Lambda funksjoner

Lambda uttrykk [1] er en utvidelse av C# og kan brukes til mye rart. her kopler vi det opp mot LINQ.

Eksempel 1

Vi skriver en filterfunksjon som plukker ut navn fra en liste basert på en alfabetisk sammenligning.

Func<string, string, bool> filter = (s, t) => s.CompareTo(t) > 0;
private void buttonStrings_Click(object sender, EventArgs e)
{
    string[] names = { "Arnold","Berit","Hans", "Jens", "Sverre", 
                       "Harald", "Hanne", "Marit"};
    IEnumerable<string> expr = from s in names
                               where filter(s, "Hanne")
                               orderby s
                               select s;
    listBox1.Items.Clear();
    foreach (string item in expr)
        listBox1.Items.Add(item);
}

Eksempel 2

Vi skriver en filterfunksjon som plukker ut objekter fra en liste basert på sammenligning av alder.

Func<person, int, bool> pfilter = (p, age) => p.Age > age;
private void buttonObjects_Click(object sender, EventArgs e)
{
    person[] plist = {new person("ole",1990),
                      new person("jens",2005),
                      new person("kari",1996) };
    IEnumerable<person> expr = from p in plist
                               where pfilter(p, 10)
                               orderby p.Age
                               select p;
    listBox1.Items.Clear();
    foreach (person item in expr)
        listBox1.Items.Add(item.Name);
}

personklassen er slik:

public class person
{
    String name;
    int faar;
    public person(String n, int f) { name = n; faar = f; }
    public int Age { get { return DateTime.Now.Year - faar; } }
    public string Name { get { return name; } }
}

Eksempel 3

Vi skriver en filterfunksjon som plukker ut deltagere i olympiader basert på distanse. Datagrunnlaget er en XML-fil beskrevet i modulen Noen datasett.

Func<XElement, String, bool> ofilter = (p, distance) =>
      ((XElement)p.Parent).Attribute("dist").Value.CompareTo(distance) == 0;
private void buttonXML_Click(object sender, EventArgs e)
{
    XDocument xdoc = new XDocument();
    xdoc = XDocument.Load(
        "http://www.it.hiof.no/~borres/commondata/olympiade/all_results.xml"
        );
    List<XmlNode> athletList = new List<XmlNode>();
    var runners = from a in xdoc.Descendants("athlet")
                  where ofilter((XElement)a, "100m")
                  select new
                  {
                      theName = a.Element("name").Value,
                      theResult = a.Element("result").Value
                  };
    listBox1.Items.Clear();
    listBox1.DisplayMember = "theName";
    foreach (var runner in runners)
        listBox1.Items.Add(runner);
}
Referanser
  1. Lambda ExpressionsMSDNmsdn.microsoft.com/en-us/library/bb397687.aspx14-01-2011
  • Alle eksemplene er samlet i ett prosjekt:
    https://svn.hiof.no/svn/psource/Csharpspikes/lambda1
Vedlikehold

B.Stenseth, januar 2011

(Velkommen) Moduler>LINQ>Lambda (Grafikk)