C# LINQ

标准的查询操作符

1、筛选

List<string> list = new List<string>() {"A1", "A2", "B1", "B2", "C1", "C2" };
var t = from v in list
           where v.StartsWith("A")
           orderby v descending
           select v;

2、带索引筛选

List<string> list = new List<string>() {"A1", "A2", "B1", "B2", "C1", "C2" };
var va = list.Where((r, index) =>
            {
                return r.StartsWith("B") && index % 2 == 0;
            }).ToList<string>();
            

3、类型筛选

List<object> objList = new List<object>() { 1, 2, "33", "44", 5, "66" };
var obj_int = objList.OfType<int>();
FunLib.printList<int>(obj_int);

 

4、复合的from语句

struct data
{
    public int[] arrInt;
    public string name;
}

List<data> dataList = new List<data>() {
    new data(){arrInt = new int[]{1,2,3}, name = "123"}, 
    new data(){arrInt = new int[]{4,5,6}, name = "456"}, 
    new data(){arrInt = new int[]{7,8,9}, name = "789"}};

var tData = from v in dataList
            from c in v.arrInt
            where v.name == "123"
            select c + 1;

 

5、排序

struct data
{
    public int[] arrInt;
    public string name;
    public int age;
    public override string ToString()
    {
        return string.Format("data[{0},{1}]", name, age);
    }
}

List<data> dataList = new List<data>() {
    new data(){arrInt = new int[]{1,2,3}, name = "a123", age = 1}, 
    new data(){arrInt = new int[]{4,5,6}, name = "a123", age = 2}, 
    new data(){arrInt = new int[]{7,8,9}, name = "a123", age = 3},
    new data(){arrInt = new int[]{7,8,9}, name = "a256", age = 4},
    new data(){arrInt = new int[]{7,8,9}, name = "a356", age = 6},
    new data(){arrInt = new int[]{7,8,9}, name = "a456", age = 5},
    new data(){arrInt = new int[]{7,8,9}, name = "789", age = 3}};
var tData = from v in dataList
            where v.name.StartsWith("a")
            orderby v.name descending, v.age//多个关键字排序,用逗号隔开
            select v.ToString();

6、分组

 

List<data> dataList = new List<data>() {
new data(){arrInt = new int[]{1,2,3}, name = "a123", age = 1},
new data(){arrInt = new int[]{4,5,6}, name = "a123", age = 2},
new data(){arrInt = new int[]{7,8,9}, name = "a123", age = 3},
new data(){arrInt = new int[]{7,8,9}, name = "a456", age = 4},
new data(){arrInt = new int[]{7,8,9}, name = "a456", age = 6},
new data(){arrInt = new int[]{7,8,9}, name = "a456", age = 5},
new data(){arrInt = new int[]{7,8,9}, name = "789",  age = 3},
};

var tData = from v in dataList
group v by v.name;

  //data[a123,1], data[a123,2], data[a123,3]
  //data[a456,4], data[a456,6], data[a456,5]
  //data[789,3]

var tData = from v in dataList
            group v by v.name into g
            where g.Key == "a123"
            select g;
//data[a123,1], data[a123,2], data[a123,3]

 

枚举查询分组的结果
foreach (IGrouping<string, data> v in tData)
{
    foreach(data d in v)
    {
    }
}

 

 

7、连接

var tData1 = from v in dataList
             join d in dataList on v.age equals d.age into g
             select g;

var tData2 = from v in dataList
             join d in dataList on v.age equals d.age
             select new
             {
                 n1 = v.name,
                 n2 = d.name,
                 age = v.age
             };

 

posted @ 2018-01-24 09:54  吴筱军  阅读(117)  评论(0)    收藏  举报