十一终于有空来记录这些问题了。

如何快速选出table中奇数行

我当时给出的方案是循环整个table中的tr,但是后来面试官说有更简单的方案。

下面来看一下简单的实现方式

简单的方式实现

jQuery选择器中我常用的有

  • #id id选择器
  • .class class选择器
  • element 元素选择器
  • :first 第一个元素
  • :last 最后一个元素

但是忘记了这两个选择器了

  • :even 偶数行
  • :odd 奇数行

    不过这两个选择器的索引是从0开始的

举一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div>
<table class="table table-condensed">
<tr>
<td>1</td>
<td>1A</td>
</tr>
<tr>
<td>2</td>
<td>2B</td>
</tr>
<tr>
<td>3</td>
<td>3C</td>
</tr>
<tr>
<td>4</td>
<td>4D</td>
</tr>
<tr>
<td>5</td>
<td>5E</td>
</tr>
</table></div>
</body>
<script>
var str ='';
$('tr:odd').each(function(){
str += $(this).text();
})
alert(str);
</script>
</html>

最后输出的结果是:
2
2B
4
4D

泛型相关

我虽然会写泛型但是对泛型实际的知识并不是那么了解,比如泛型约束支持哪些类型和为什么使用约束,我都没有说的明白。

接下来简单的看看泛型的部分内容

泛型概述

  • 使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。
  • 泛型最常见的用途是创建集合类。
  • .NET 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类。 应尽可能使用这些类来代替某些类,如 System.Collections 命名空间中的 ArrayList。
  • 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
  • 可以对泛型类进行约束以访问特定数据类型的方法。
  • 在泛型数据类型中所用类型的信息可在运行时通过使用反射来获取。

    泛型的约束

    约束告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。 如果客户端代码使用不满足约束的类型,编译器将发出错误。 通过使用 where 上下文关键字指定约束。

    七种类型的约束

    约束 描述
    where T : struct 类型参数必须是不可为 null 的值类型。由于所有值类型都具有可访问的无参数构造函
    where T : class 类型参数必须是引用类型。 此约束还应用于任何类、接口、委托或数组类型。 在 C#8.0 或更高版本中的可为 null 上下文中,T 必须是不可为 null 的引用类型。
    where T : class? 类型参数必须是可为 null 或不可为 null 的引用类型。 此约束还应用于任何类、接口、委托或数组类型。
    where T : notnull 类型参数必须是不可为 null 的类型。 参数可以是 C# 8.0 或更高版本中的不可为 null 的引用类型,也可以是不可为 null 的值类型。
    where T : unmanaged 类型参数必须是不可为 null 的非托管类型。 unmanaged 约束表示 struct 约束,且不能与 struct 约束或 new() 约束结合使用。
    where T : new() 类型参数必须具有公共无参数构造函数。 与其他约束一起使用时,new() 约束必须最后指定。 new() 约束不能与 structunmanaged 约束结合使用。
    where T : <base class name> 类型参数必须是指定的基类或派生自指定的基类。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 必须是从指定基类派生的不可为 null 的引用类型。
    where T : <base class name>? 类型参数必须是指定的基类或派生自指定的基类。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 可以是从指定基类派生的可为 null 或不可为 null 的类型。
    where T : <interface name> 类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 必须是实现指定接口的不可为 null 的类型。
    where T : <interface name>? 类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。 在 C# 8.0 中的可为 null 上下文中,T 可以是可为 null 的引用类型、不可为 null 的引用类型或值类型。
    where T : U T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。 在可为 null 的上下文中,如果 U 是不可为 null 的引用类型,T 必须是不可为 null 的引用类型。 如果 U 是可为 null 的引用类型,则 T 可以是可为 null 的引用类型,也可以是不可为 null 的引用类型。

    使用约束的原因

    约束指定类型参数的功能和预期。 声明这些约束意味着你可以使用约束类型的操作和方法调用。 如果泛型类或方法对泛型成员使用除简单赋值之外的任何操作或调用 System.Object 不支持的任何方法,则必须对类型参数应用约束。 例如,基类约束告诉编译器,仅此类型的对象或派生自此类型的对象可用作类型参数。 编译器有了此保证后,就能够允许在泛型类中调用该类型的方法。 以下代码示例演示可通过应用基类约束添加到(泛型介绍中的)GenericList<T> 类的功能。

    未绑定的类型参数

    没有约束的类型参数(如公共类 SampleClass<T>{} 中的 T)称为未绑定的类型参数。 未绑定的类型参数具有以下规则:
  • 不能使用 !=== 运算符,因为无法保证具体的类型参数能支持这些运算符。
  • 可以在它们与 System.Object 之间来回转换,或将它们显式转换为任何接口类型。
  • 可以将它们与 null 进行比较。 将未绑定的参数与 null 进行比较时,如果类型参数为值类型,则该比较将始终返回 false
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    // type parameter T in angle brackets
    public class GenericList<T>
    {
    // The nested class is also generic on T.
    private class Node
    {
    // T used in non-generic constructor.
    public Node(T t)
    {
    next = null;
    data = t;
    }

    private Node next;
    public Node Next
    {
    get { return next; }
    set { next = value; }
    }

    // T as private member data type.
    private T data;

    // T as return type of property.
    public T Data
    {
    get { return data; }
    set { data = value; }
    }
    }

    private Node head;

    // constructor
    public GenericList()
    {
    head = null;
    }

    // T as method parameter type:
    public void AddHead(T t)
    {
    Node n = new Node(t);
    n.Next = head;
    head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
    Node current = head;

    while (current != null)
    {
    yield return current.Data;
    current = current.Next;
    }
    }
    }
    以上来自官方文档

总结

目前先写这些,以后再更新。希望大家都可以找到自己心仪的工作哇🤩