在學習C#中的記錄類型時,對出現的Equals和ReferenceEquals得到的不同結果表示不理解,隨即進行相關資料查找。 值類型 == : 比較兩者的“內容”是否相同,即“值”是否一樣Equals:比較兩者的“內容”是否相同,即“值”是否一樣ReferenceEquals:返回false,因為 ...
SQL
IQuerable 和 IEnumerable 的主要區別?
So the difference between IQueryable and IEnumerable is about where the filter logic is executed. One executes on the client side and the other executes on the database.
So if you work with only in-memory data collection, IEnumerable is a good choice, but if you want to query data collection which is connected with database IQueryable is a better choice as it reduces network traffic and uses the power of SQL language.
Id name, 刪除重覆數據
這道題沒答上來有點可惜了...
DELETE FROM A
WHERE id NOT IN (
SELECT MIN(id) -- 保留name列最小id值的行
FROM A
GROUP BY name
)
把一個表裡的列裝到另一個表裡
將表A中s1列包含'abc'的行的s2和s3兩列插入到表B作為s1和s2兩列
INSERT INTO B (s1, s2)
SELECT s2, s3 FROM A
WHERE s1 LIKE '%abc%';
select * A,B多少行列?
行:rowA * rowB ,列:rowA + rowB
笛卡爾積:
樂觀鎖
樂觀鎖是一種併發控制機制,用於解決多個線程同時修改同一數據時可能導致的數據不一致問題。常見的實現樂觀鎖的方式是通過版本控制機制,以下是一種常見的實現方法:
- 添加版本欄位:在需要進行併發控制的數據表中,添加一個用於記錄版本號的欄位。這個欄位可以是一個整數或時間戳類型。
- 讀取數據和版本號:在讀取數據時,同時獲取當前數據的版本號。
- 進行數據修改:當要對數據進行修改時,首先檢查當前持有的版本號是否與最新的版本號一致。可以通過將要修改的數據的版本號與讀取時獲取的版本號進行比較。
- 樂觀鎖衝突處理:
-
如果版本號一致,說明沒有其他線程修改過數據,可以進行修改操作,並更新版本號。
-
如果版本號不一致,說明數據已經被其他線程修改過,可能存在併發衝突。可以選擇取消當前操作、重試操作或執行其他相關的處理邏輯。
-
推理題
100盞燈
大廳里有100盞燈,每盞燈都編了號碼,分別為1-100。每盞燈由一個開關來控制。(開關按一下,燈亮,再按一下燈滅。開關的編號與被控制的燈相同。)開始時,燈是全滅的。現在按照以下規則按動開關。
第一次,將所有的燈點亮。
第二次,將所有2的倍數的開關按一下。
第三次,將所有3的倍數的開關按一下。
以此類推。第N次,將所有N的倍數的開關按一下。
問第100次按完以後,大廳里還有幾盞燈是亮的。
依次寫下去,就可以發現,每個燈被操作的步驟,其實為此燈編號的因數。
如燈36被操作的步驟:
(1, 36), (2, 18), (3, 12), (4, 9), (6, 6), (9, 4), (12, 3), (18, 2) (36, 1)
此時題目轉化為求[1-100]100個數中,因數個數為奇數的數的數量是多少。
我們註意到,求一個數因數的過程,是從1開始到其平方根,除平方根外,其他的因數都是成對的出現,也就是只有平方數的因數是奇數個!
100以內的平方數只有10個,分別是1,4,9,16,25,36,49,64,81,100,所以上述題目的最後結果是10個燈最後是亮著的。
編程題
如何實現一個可以自定義的可以進行foreach的集合
-
創建集合類實現IEnumerable介面的GetEnumerator方法返回一個迭代器
-
創建迭代器類實現IEnumerator介面的MoveNext、Reset、Current方法
-
foreach:
var enumerator = collection.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }
// 自定義集合類
public class MyCollection : IEnumerable
{
private object[] items;
public MyCollection()
{
items = new object[3];
items[0] = "Apple";
items[1] = "Banana";
items[2] = "Orange";
}
// 實現 IEnumerable 介面的 GetEnumerator() 方法
public IEnumerator GetEnumerator()
{
return new MyEnumerator(items);
}
}
// 自定義枚舉器類
public class MyEnumerator : IEnumerator
{
private object[] items;
private int position = -1;
public MyEnumerator(object[] collection)
{
items = collection;
}
// 實現 IEnumerator 介面的 MoveNext() 方法
public bool MoveNext()
{
position++;
return (position < items.Length);
}
// 實現 IEnumerator 介面的 Reset() 方法
public void Reset()
{
position = -1;
}
// 實現 IEnumerator 介面的 Current 屬性
public object Current
{
get { return items[position]; }
}
}
如下代碼輸出是什麼?
[TestClass]
public class InheritanceTest
{
[TestMethod]
public void test()
{
A a = new A();
B b = new B();
a.Func2(b);
b.Func2(a);
}
class A
{
public virtual void Func1(int i)
{
Console.WriteLine(i);
}
public void Func2(A a)
{
a.Func1(1);
Func1(5);
}
}
class B : A
{
public override void Func1(int i)
{
base.Func1(i+1);
}
public void Func2(A a)
{
a.Func1(1);
Func1(5);
}
}
}
/*
2
5
1
6
*/
實際上是對多態的考察,一個對象的實際類型不由“解釋”它的介面/基類類型決定,而是由分配記憶體時(new)創建的對象決定。