3 回答

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果你需要一個(gè)List<int>
,你不能這樣做。AList<int>
總是直接包含它的數(shù)據(jù),所以當(dāng)你有兩個(gè)(比如說(shuō))100 個(gè)元素的數(shù)組和一個(gè)通過(guò)連接這兩個(gè)元素創(chuàng)建的列表時(shí),你已經(jīng)有了 400 個(gè)獨(dú)立元素。你無(wú)法改變這一點(diǎn)。
您正在尋找的是一種不創(chuàng)建數(shù)據(jù)的獨(dú)立副本的方法。如果您只是在搜索它(就像評(píng)論中的聲音一樣),您可以使用使用IEnumerable<int>
LINQ 創(chuàng)建的:
IEnumerable<int> concat = a.Concat(b);
如果您需要類似 anIReadOnlyList<T>
甚至 an 的東西IList<T>
,您可以自己實(shí)現(xiàn)這些接口以在多個(gè)數(shù)組上創(chuàng)建適配器 - 但您可能需要自己編寫(xiě)。如果你能堅(jiān)持IEnumerable<T>
使用 LINQ,使用 LINQ 會(huì)簡(jiǎn)單很多。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
我可以建議您進(jìn)行一些優(yōu)化:
IEnumerable<int>在不調(diào)用 ToArray() 方法的情況下初始化 a 和 b
int size = 1000 * 1024 * 1024 / 4;
IEnumerable<int> a = Enumerable.Range(0, size);
IEnumerable<int> b = Enumerable.Range(0, size);
用已知容量初始化 concat
List<int> concat = new List<int>(size);
結(jié)果我得到以下輸出:
Initial memory size: 12 MB
Memory size after lists initialization: 13 MB
Memory size after lists concatenation: 1021 MB
如果您只想串聯(lián)搜索某些內(nèi)容,則可以這樣做而無(wú)需額外分配:
IEnumerable<int> concat = a.Skip(500 * 1024 * 1024 / 4).Concat(b.Skip(500 * 1024 * 1024 / 4));
int search = concat.Count(i => i % 2 == 0);
Console.WriteLine($"Search result: {search}");

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
他們是執(zhí)著的。我只需要連接它們,進(jìn)行一些搜索,然后處理連接列表
如果您只需要進(jìn)行一些搜索,為什么首先需要連接?分別搜索兩個(gè)數(shù)組。
您正在搜索的內(nèi)容可能會(huì)橋接兩個(gè)數(shù)組。如果是這種情況,為了讓事情變得更容易并且不支付內(nèi)存價(jià)格,只需實(shí)現(xiàn)一個(gè)模擬操作但實(shí)際上不執(zhí)行它的包裝器:
sealed class Concatenated<T>:
IReadOnlyList<T>
{
public static Concatenated<T>
Concatenate<T>(
IReadOnlyList<T> first,
IReadOnlyList<T> second)
=> new ConcatenatedArray<T>(first, second);
private readonly IReadOnlyList<T>
first, second;
private Concatenated(
IReadOnlyList<T> first,
IReadOnlyList<T> second)
{
this.first = first;
this.second = second;
}
public T this[int index]
=> index < first.Length ?
first[index]:
second[index - first.Length];
public int Count => first.Length + second.Length;
public IEnumerator<T> GetEnumerator()
{
foreach (var f in first)
yield return f;
foreach (var s in second)
yield return s;
}
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
}
- 3 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報(bào)