2013-04-21 20:04:06 zzy7075 阅读数 1192
  • C#SQL查询技术

    本课程以SQL Server 2008 R2数据库系统为例,全面介绍SQL查询技术,包括select语句,Where子句,Order By子句,Group By子句,having语句,TOP和PERCENT限制查询结果,在查询中使用OR和AND运算符,聚合函数应用,多表连接查询,嵌套查询,子查询,联合语句Union,内联接、外联接查询,交叉表查询,视图、存储过程的应用,触发器的应用等。

    1402 人正在学习 去看看 武占文

C# where子句

where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。
1.接口约束。
例如,可以声明一个泛型类 MyGenericClass,这样,类型参数T 就可以实现 IComparable<T> 接口:

public class MyGenericClass<T>where T:IComparable { }

2.基类约束:指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。
这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。
class MyClassy<T, U>
where T :
class
where U :
struct
{
}

3.where 子句还可以包括构造函数约束。
可以使用 new 运算符创建类型参数的实例;但类型参数为此必须受构造函数约束 new() 的约束。new() 约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。例如:
public class MyGenericClass <T> where T: IComparable, new()
{
//The following line is not possible without new() constraint:

T item= new T();
}
new() 约束出现在 where 子句的最后。

4.对于多个类型参数,每个类型参数都使用一个 where 子句,
例如:
interface MyI { }
class Dictionary<TKey,TVal>

where TKey: IComparable, IEnumerable
where TVal: MyI
{
publicvoid Add(TKey key, TVal val)
{
}
}

5.还可以将约束附加到泛型方法的类型参数,例如:

public bool MyMethod<T>(T t) where T : IMyInterface { }

请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的:

delegate T MyDelegate<T>() where T :new()
2019-08-01 23:38:00 weixin_30478923 阅读数 273
  • C#SQL查询技术

    本课程以SQL Server 2008 R2数据库系统为例,全面介绍SQL查询技术,包括select语句,Where子句,Order By子句,Group By子句,having语句,TOP和PERCENT限制查询结果,在查询中使用OR和AND运算符,聚合函数应用,多表连接查询,嵌套查询,子查询,联合语句Union,内联接、外联接查询,交叉表查询,视图、存储过程的应用,触发器的应用等。

    1402 人正在学习 去看看 武占文
原文:c# where(泛型类型约束)

定义:在定义泛型的时候,我们可以使用 where 限制参数的范围。

使用:在使用泛型的时候,你必须尊守 where 限制参数的范围,否则编译不会通过。

 

六种类型的约束:

T:类(类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。)

    class MyClass<T, U>
        where T : class///约束T参数必须为“引用 类型{ }”
        where U : struct///约束U参数必须为“值 类型”
    { }

T:结构(类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。)

    class MyClass<T, U>
        where T : class///约束T参数必须为“引用 类型{ }”
        where U : struct///约束U参数必须为“值 类型”
    { }

T:new()(类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。)

class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
    // ...
}

T:<基类名>(类型参数必须是指定的基类或派生自指定的基类。)

public class Employee{}

public class GenericList<T> where T : Employee

T:<接口名称>(类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。)

复制代码
    /// <summary>
    /// 接口
    /// </summary>
    interface IMyInterface
    {
    }

    /// <summary>
    /// 定义的一个字典类型
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TVal"></typeparam>
    class Dictionary<TKey, TVal>
        where TKey : IComparable, IEnumerable
        where TVal : IMyInterface
    {
        public void Add(TKey key, TVal val)
        {
        }
    }
复制代码

T:U(为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。也就是说T和U的参数必须一样

class List<T>
{
    void Add<U>(List<U> items) where U : T {/*...*/}
}

 

一、可用于类:

public class MyGenericClass<T> where T:IComparable { }

二、可用于方法:

public bool MyMethod<T>(T t) where T : IMyInterface { }

三、可用于委托:

delegate T MyDelegate<T>() where T : new()
posted on 2019-08-01 23:38 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/11286115.html

2018-03-21 00:29:26 L_ZhiWei 阅读数 1049
  • C#SQL查询技术

    本课程以SQL Server 2008 R2数据库系统为例,全面介绍SQL查询技术,包括select语句,Where子句,Order By子句,Group By子句,having语句,TOP和PERCENT限制查询结果,在查询中使用OR和AND运算符,聚合函数应用,多表连接查询,嵌套查询,子查询,联合语句Union,内联接、外联接查询,交叉表查询,视图、存储过程的应用,触发器的应用等。

    1402 人正在学习 去看看 武占文

首先贴出一段代码

public class BusinessBaseBLL<T, S> : BaseBLL<T, S> where T : new() where S : BusinessDAL<T>, new()

看到第一点感觉自己就蒙了,接触C#这么久,尽然怎么会用where,也不是很明白,今天查了一下msdn(点击打开链接),才明白,原来where是约束泛型的。

就像 

BaseBLL<T, S> where T : new() 

可以这样理解,T 必须是一个具有无参构造函数的类,其中new () 指的是无参构造函数约束;

我把第一理解为  BusinessBaseBLL<T, S> 类继承  BaseBLL<T, S> 

第二 BaseBLL<T, S> where T : new() T 的类型是无参构造的类

第三 BaseBLL<T, S> where S : BusinessDAL<T>, new()

S 是 BusinessDAL<T> 类型的,并且是具有无参构造函数的!


以上是本人的理解,如果有理解错误,请求大神批评指出,别误导他人!谢谢


2017-10-24 20:28:15 haishu_zheng 阅读数 3152
  • C#SQL查询技术

    本课程以SQL Server 2008 R2数据库系统为例,全面介绍SQL查询技术,包括select语句,Where子句,Order By子句,Group By子句,having语句,TOP和PERCENT限制查询结果,在查询中使用OR和AND运算符,聚合函数应用,多表连接查询,嵌套查询,子查询,联合语句Union,内联接、外联接查询,交叉表查询,视图、存储过程的应用,触发器的应用等。

    1402 人正在学习 去看看 武占文

在学本节之前,请先复习 小朋友学C语言(17):二进制

一、二进制转换为十进制的C语言代码

#include <stdio.h>
#include <string.h>

int binary2decimal(char str[])
{
    int sum = 0;
    int j = 1;
    int pos = strlen(str) - 1;
    for(; pos >= 0; pos--) 
    {
        sum += (str[pos] - '0') * j;
        j *= 2;
    }

    return sum;
}

int main()
{
    // 字符用单引号,字符串用双引号 
    int result = binary2decimal("1101");
    printf("Output decimal: %d\n", result);

    return 0;
}

运行结果:

Output decimal: 13


思路:
以”1101”为例。
(1)先计算出最右侧的“1”, sum(“1”) = 1
(2)再计算出最右侧的“01”,并且要用到上次计算的结果。sum(“01”) = sum(“0”) + sum(“1”) = 1
(3)再计算出最右侧的“101”,并且要用到上次计算的结果。sum(“101”) = sum(“1”) + sum(“01”) = 4 + 1 = 5
(4)最后计算出“1101”,并且要利用上次计算的结果。sum(“1101”) = sum(“1”) + sum(“101”) = 8 + 5 = 13


程序分析:
(1)for(; pos >= 0; pos–)
这里第一个表达式没有内容,那是因为在上一步已经赋值了,这里可以省略。

(2)sum += (str[pos] -‘0’) * j 等价于 sum = sum + (str[pos] - ‘0’) * j
j = 2 等价于 j = j 2

(3)数组的下标是从左往右递增的。
例1:str[] = “abcde”,则str[0] = ‘a’, str[1] = ‘b’, str[2] = ‘c’, str[3] = ‘d’, str[4] = ‘e’
例2:str[] = “1101”,则str[0] = ‘1’,str[1] = ‘1’, str[2] = ‘0’, str[3] = ‘1’

二进制与数组相反,二进制的最低位在最右边,最高位在最左边。十进制也是如此。
比如二进制1101,第0位的值是1,第1位的值是0,第2位的值是1,第3位的值是1。

程序中的for采用了从高位向低位递减,就是因为二进制与数组的下标顺序相反。

(4)for的计算过程
刚开始时,pos = strlen(“1101”) - 1 = 4 - 1 = 3
① 第1 次循环,pos = 3,str[pos] - ‘0’ = ‘1’ - ‘0’ = 49 - 48 = 1, sum = sum + 1 * j = 0 + 1 * 1 = 1, j = j * 2 = 1 * 2 = 2, pos自减后变为2
② 第2次循环,pos = 2, str[pos] - ‘0’ = ‘0’ - ‘0’= 48 - 48 = 0,sum = sum + 0 * j = 1 + 0 * 2 = 1, j = j * 2 = 2 * 2 = 4,pos自减后变为1
③ 第3次循环,pos = 1, str[pos] - ‘0’ = ‘1’ - ‘0’= 49 - 48 = 1,sum = sum + 1 * j = 1 + 1 * 4 = 5, j = j * 2 = 4 * 2 = 8,pos自减后变为0
④ 第4次循环,pos = 0, str[pos] - ‘0’ = ‘1’ - ‘0’= 49 - 48 = 1,sum = sum + 1 * j = 5 + 1 * 8 = 13, j = j * 2 = 8 * 2 = 16,pos自减后变为-1,循环结束。
所以,最终的结果就是13

二、十进制转换为二进制的C语言代码

#include<stdio.h>

void decimal2binary(int dec)
{
    if(dec / 2)
    {
        decimal2binary(dec / 2); // 递归
    }
    printf("%d", dec % 2);
}

int main()
{
    int num = 6;
    printf("%d转化为二进制:", num);
    decimal2binary(num);

    return 0;
}

运行结果:

6转化为二进制:110

程序分析:
(1)这里decimal2binary()函数调用了decimal2binary()函数,说明用到了递归。

(2)程序中,运算符“/”表示除号。
例1:6 / 2 = 3
例2:3 / 2 = 1
例3:1 / 2 = 0
运算符“%”表示求余数。
例4:6 % 2 = 0
例5:3 % 2 = 1
例3:1 % 2 = 1

(3)递归调用过程
第一次在main()中调用decimal2binary(6)      
在这个函数中,if(6 / 2) = if(3)判断为真,
所以会调用decimal2binary(3)            
在这个函数中,if(3 / 2) = if(1)判断为真,
所以会调用decimal2binary(1)            
在这个函数中,if(1 / 2) = if(0)判断为假。递归结束。

所以,这里decimal2binary()总共被调用了三次,第一次是在main()中调用的,第二次和第三次都是自己调用自己。
按照递归函数从外到内,再从内到外的执行顺序,这里的执行顺序是①–>②–>③–>②–>①

执行decimal2binary(1)时,因为if不成立,所以跳过if语句,执行printf语句。因为1 % 2 = 1,所以打印出了1。
接着跳出本次递归,继续执行decimal2binary(3),执行printf语句。因为3 % 2 = 1,所以打印出了1。
接着跳出本次递归,继续执行decimal2bianry(6),执行printf语句,因为6 % 2 = 0,所以打印出了0。
这时所有的递归都结束了。所以最终打印出来的结果是110

(4)递归调用完全展开的代码为:

// 执行deimal2binary(6)
if(6 / 2)           // 6 / 2 = 3, 条件为真
{       
    // 执行decimal2binary(3)
    if(3 / 2)       // 3 / 2 = 1, 条件为真 
    {
        // 执行decimal2binary(1)
        if(1 / 2)   // 1 / 2 = 0, 条件为假
        {
                    // 这里的句子不被执行,所以不再递归 
        }
        printf("%d", 1 % 2);    // 打印出1,控制台中可看到“1”      
    }
    printf("%d", 3 % 2);        // 打印出1,控制台中可看到“11” 
}
printf("%d", 6 % 2);            // 打印出0,控制台中可看到“110”,即最终结果

这样,假如不写decimal2bianry函数的话,整个程序可以写成

#include<stdio.h>

int main()
{
    int num = 6;
    printf("%d转化为二进制:",num);
    if(6 / 2)           // 条件为真
    {       
        if(3 / 2)       // 条件为真 
        {
            if(1 / 2)   // 条件为假
            {
                        // 无论什么语句,都不会被执行 
            }
            printf("%d", 1 % 2);    // 打印出1,控制台中可看到“1”      
        }
        printf("%d", 3 % 2);        // 打印出1,控制台中可看到“11” 
    }
    printf("%d", 6 % 2);            // 打印出0,控制台中可看到“110”,即最终结果

    return 0;
}

运行结果:

6转化为二进制:110

这里因为6比较小,产生的if语句只有三个,所以像上面这样直接写也不算太麻烦。
但是,假如是一个很大的十进制要转化为二进制,比如500000000,会有很多个if语句,不可能直接在main函数里写这么多if语句。这样就有必要独立写一个decimal2binary函数,让main去调用decimal2binary,decimal2binary再调用自己,几行代码就能搞定,程序看起来就简洁多了。

当然,还可以用for来实现,也会很简单。不过咱们这个程序的另一目的是为了强化学习递归思想。


(5)程序的执行流程图为:

1.png

(6)作业
断点调试;
默写。



更多内容请关注微信公众号
wchat_official.jpg

2014-04-15 11:33:27 qazwsx185313301 阅读数 438
  • C#SQL查询技术

    本课程以SQL Server 2008 R2数据库系统为例,全面介绍SQL查询技术,包括select语句,Where子句,Order By子句,Group By子句,having语句,TOP和PERCENT限制查询结果,在查询中使用OR和AND运算符,聚合函数应用,多表连接查询,嵌套查询,子查询,联合语句Union,内联接、外联接查询,交叉表查询,视图、存储过程的应用,触发器的应用等。

    1402 人正在学习 去看看 武占文
一查询数值型数据:
 SELECT * FROM tb_name WHERE sum > 100;
 查询谓词:>,=,<,<>,!=,!>,!<,=>,=<
 
二查询字符串
 SELECT * FROM tb_stu  WHERE sname  =  '小刘'
 SELECT * FROM tb_stu  WHERE sname like '刘%'
 SELECT * FROM tb_stu  WHERE sname like '%程序员'
 SELECT * FROM tb_stu  WHERE sname like '%PHP%'
 
三查询日期型数据
 SELECT * FROM tb_stu WHERE date = '2011-04-08'
 注:不同数据库对日期型数据存在差异: :
 (1)MySQL:SELECT * from tb_name WHERE birthday = '2011-04-08'
 (2)SQL Server:SELECT * from tb_name WHERE birthday = '2011-04-08'
 (3)Access:SELECT * from tb_name WHERE birthday = #2011-04-08#
 
四查询逻辑型数据
 SELECT * FROM tb_name WHERE type = 'T'
 SELECT * FROM tb_name WHERE type = 'F'
 逻辑运算符:and or not
 
五查询非空数据
 SELECT * FROM tb_name WHERE address <>'' order by addtime desc
 注:<>相当于PHP中的!=
 
六利用变量查询数值型数据
 SELECT * FROM tb_name WHERE id = '$_POST[text]' 
注:利用变量查询数据时,传入SQL的变量不必用引号括起来,因为PHP中的字符串与数值型数据进行连接时,程序会自动将数值型数据转变成字符串,然后与要连接的字符串进行连接
 
七利用变量查询字符串数据 
SELECT * FROM tb_name WHERE name LIKE '%$_POST[name]%' 
完全匹配的方法"%%"表示可以出现在任何位置
 
八查询前n条记录
 SELECT * FROM tb_name LIMIT 0,$N;
 limit语句与其他语句,如order by等语句联合使用,会使用SQL语句千变万化,使程序非常灵活
 
九查询后n条记录
 SELECT * FROM tb_stu ORDER BY id ASC LIMIT $n
 
十查询从指定位置开始的n条记录
 SELECT * FROM tb_stu ORDER BY id ASC LIMIT $_POST[begin],$n
 注意:数据的id是从0开始的
 
十一查询统计结果中的前n条记录
 SELECT * ,(yw+sx+wy) AS total FROM tb_score ORDER BY (yw+sx+wy) DESC LIMIT 0,$num
 
十二查询指定时间段的数据
 SELECT  要查找的字段 FROM 表名 WHERE 字段名 BETWEEN 初始值 AND 终止值
 SELECT * FROM tb_stu WHERE age BETWEEN 0 AND 18
 
十三按月查询统计数据
 SELECT * FROM tb_stu WHERE month(date) = '$_POST[date]' ORDER BY date ;
 注:SQL语言中提供了如下函数,利用这些函数可以很方便地实现按年、月、日进行查询
 year(data):返回data表达式中的公元年分所对应的数值
 month(data):返回data表达式中的月分所对应的数值
 day(data):返回data表达式中的日期所对应的数值
 
十四查询大于指定条件的记录
 SELECT * FROM tb_stu WHERE age>$_POST[age] ORDER BY age;
 
十五查询结果不显示重复记录
 SELECT DISTINCT 字段名 FROM 表名 WHERE 查询条件 
注:SQL语句中的DISTINCT必须与WHERE子句联合使用,否则输出的信息不会有变化 ,且字段不能用*代替
 
十六NOT与谓词进行组合条件的查询
 (1)NOT BERWEEN … AND … 对介于起始值和终止值间的数据时行查询 可改成 <起始值 AND >终止值
 (2)IS NOT NULL 对非空值进行查询 
 (3)IS NULL 对空值进行查询
 (4)NOT IN 该式根据使用的关键字是包含在列表内还是排除在列表外,指定表达式的搜索,搜索表达式可以是常量或列名,而列名可以是一组常量,但更多情况下是子查询
 
十七显示数据表中重复的记录和记录条数
 SELECT  name,age,count(*) ,age FROM tb_stu WHERE age = '19' group by date
 
十八对数据进行降序/升序查询
 SELECT 字段名 FROM tb_stu WHERE 条件 ORDER BY 字段 DESC 降序
 SELECT 字段名 FROM tb_stu WHERE 条件 ORDER BY 字段 ASC  升序
 注:对字段进行排序时若不指定排序方式,则默认为ASC升序
 
十九对数据进行多条件查询
 SELECT 字段名 FROM tb_stu WHERE 条件 ORDER BY 字段1 ASC 字段2 DESC  …
 注意:对查询信息进行多条件排序是为了共同限制记录的输出,一般情况下,由于不是单一条件限制,所以在输出效果上有一些差别。
 
二十对统计结果进行排序
 函数SUM([ALL]字段名) 或 SUM([DISTINCT]字段名),可实现对字段的求和,函数中为ALL时为所有该字段所有记录求和,若为DISTINCT则为该字段所有不重复记录的字段求和
 如:SELECT name,SUM(price) AS sumprice  FROM tb_price GROUP BY name
 
SELECT * FROM tb_name ORDER BY mount DESC,price ASC
 
二十一单列数据分组统计
 SELECT id,name,SUM(price) AS title,date FROM tb_price GROUP BY pid ORDER BY title DESC
 注:当分组语句group by排序语句order by同时出现在SQL语句中时,要将分组语句书写在排序语句的前面,否则会出现错误
 
二十二多列数据分组统计
 多列数据分组统计与单列数据分组统计类似 
SELECT *,SUM(字段1*字段2) AS (新字段1) FROM 表名 GROUP BY 字段 ORDER BY 新字段1 DESC
 SELECT id,name,SUM(price*num) AS sumprice  FROM tb_price GROUP BY pid ORDER BY sumprice DESC
 注:group by语句后面一般为不是聚合函数的数列,即不是要分组的列
 
二十三多表分组统计
 SELECT a.name,AVG(a.price),b.name,AVG(b.price) FROM tb_demo058 AS a,tb_demo058_1 AS b WHERE a.id=b.id GROUP BY b.type;

C# where()筛选方法

阅读数 2123

C#Where关键字

阅读数 9

C# where子句

阅读数 4

没有更多推荐了,返回首页