Telegram Group & Telegram Channel
💡 Задача: Загадочный Кэш

У тебя есть метод, который возвращает последовательность чисел, вычисляемую с задержкой (например, чтение из удалённого ресурса):


public static IEnumerable<int> GetSlowData()
{
Console.WriteLine("Fetching data...");
yield return 1;
Thread.Sleep(1000);
yield return 2;
Thread.Sleep(1000);
yield return 3;
}

Теперь тебе нужно реализовать метод ProcessData(), который:

Вызывает GetSlowData() один раз.

Проходит по данным дважды: сначала фильтрует только чётные, потом считает сумму всех.

Не должен повторно "запрашивать" данные (то есть Fetching data... должен выводиться один раз).

Не должен использовать ToList(), ToArray() или другие методы, загружающие всё в память явно.

🧠 Вопрос с подвохом: Как реализовать ProcessData()?
Напиши реализацию:


public static void ProcessData()
{
// твой код здесь
}


🔎 Подсказка
Если ты просто используешь IEnumerable<int> и дважды к нему обращаешься — будет два запроса. Но есть один способ реализовать ленивое кэширование, не загружая всё в память сразу и не повторяя yield return.

Решение:

Если ты просто напишешь вот так:

```csharp
var data = GetSlowData();

var evens = data.Where(x => x % 2 == 0);
var sum = data.Sum();```

то GetSlowData() будет вызван дважды, потому что IEnumerable ленивый — и при каждом новом foreach начинается всё заново. Это видно по двойному выводу Fetching data....

🧠 Цель: пройтись по данным один раз, кэшируя элементы "на лету", и позволить другим перечислениям работать без повторного получения.
Решение: Используем ленивый кеш — с помощью кастомного итератора

```csharp
public static void ProcessData()
{
var cached = new MemoizedEnumerable<int>(GetSlowData());

var evens = cached.Where(x => x % 2 == 0);
var sum = cached.Sum();

Console.WriteLine("Even numbers: " + string.Join(", ", evens));
Console.WriteLine("Sum: " + sum);
}```
А вот реализация ленивого кеширующего MemoizedEnumerable<T>:

```csharp
public class MemoizedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerator<T> _source;
private readonly List<T> _cache = new();
private bool _sourceFinished = false;

public MemoizedEnumerable(IEnumerable<T> source)
{
_source = source.GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
int index = 0;
while (true)
{
if (index < _cache.Count)
{
yield return _cache[index];
}
else
{
if (_sourceFinished || !_source.MoveNext())
{
_sourceFinished = true;
yield break;
}

_cache.Add(_source.Current);
yield return _source.Current;
}
index++;
}
}

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}```

🧪 Что происходит
MemoizedEnumerable запоминает каждый элемент один раз при первом проходе.

Следующие проходы используют кэш.

Fetching data... будет вызван только один раз.

💥 Подвох
Большинство подумает, что IEnumerable можно безопасно переиспользовать без сайд-эффектов. Но не тут-то было: без кэширования yield выполнится дважды. Многие Middle+ разработчики ошибаются именно тут.



tg-me.com/csharp_ci/1334
Create:
Last Update:

💡 Задача: Загадочный Кэш

У тебя есть метод, который возвращает последовательность чисел, вычисляемую с задержкой (например, чтение из удалённого ресурса):


public static IEnumerable<int> GetSlowData()
{
Console.WriteLine("Fetching data...");
yield return 1;
Thread.Sleep(1000);
yield return 2;
Thread.Sleep(1000);
yield return 3;
}

Теперь тебе нужно реализовать метод ProcessData(), который:

Вызывает GetSlowData() один раз.

Проходит по данным дважды: сначала фильтрует только чётные, потом считает сумму всех.

Не должен повторно "запрашивать" данные (то есть Fetching data... должен выводиться один раз).

Не должен использовать ToList(), ToArray() или другие методы, загружающие всё в память явно.

🧠 Вопрос с подвохом: Как реализовать ProcessData()?
Напиши реализацию:


public static void ProcessData()
{
// твой код здесь
}


🔎 Подсказка
Если ты просто используешь IEnumerable<int> и дважды к нему обращаешься — будет два запроса. Но есть один способ реализовать ленивое кэширование, не загружая всё в память сразу и не повторяя yield return.

Решение:

Если ты просто напишешь вот так:

```csharp
var data = GetSlowData();

var evens = data.Where(x => x % 2 == 0);
var sum = data.Sum();```

то GetSlowData() будет вызван дважды, потому что IEnumerable ленивый — и при каждом новом foreach начинается всё заново. Это видно по двойному выводу Fetching data....

🧠 Цель: пройтись по данным один раз, кэшируя элементы "на лету", и позволить другим перечислениям работать без повторного получения.
Решение: Используем ленивый кеш — с помощью кастомного итератора

```csharp
public static void ProcessData()
{
var cached = new MemoizedEnumerable<int>(GetSlowData());

var evens = cached.Where(x => x % 2 == 0);
var sum = cached.Sum();

Console.WriteLine("Even numbers: " + string.Join(", ", evens));
Console.WriteLine("Sum: " + sum);
}```
А вот реализация ленивого кеширующего MemoizedEnumerable<T>:

```csharp
public class MemoizedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerator<T> _source;
private readonly List<T> _cache = new();
private bool _sourceFinished = false;

public MemoizedEnumerable(IEnumerable<T> source)
{
_source = source.GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
int index = 0;
while (true)
{
if (index < _cache.Count)
{
yield return _cache[index];
}
else
{
if (_sourceFinished || !_source.MoveNext())
{
_sourceFinished = true;
yield break;
}

_cache.Add(_source.Current);
yield return _source.Current;
}
index++;
}
}

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}```

🧪 Что происходит
MemoizedEnumerable запоминает каждый элемент один раз при первом проходе.

Следующие проходы используют кэш.

Fetching data... будет вызван только один раз.

💥 Подвох
Большинство подумает, что IEnumerable можно безопасно переиспользовать без сайд-эффектов. Но не тут-то было: без кэширования yield выполнится дважды. Многие Middle+ разработчики ошибаются именно тут.

BY C# (C Sharp) programming


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/csharp_ci/1334

View MORE
Open in Telegram


C C Sharp programming Telegram | DID YOU KNOW?

Date: |

Should I buy bitcoin?

“To the extent it is used I fear it’s often for illicit finance. It’s an extremely inefficient way of conducting transactions, and the amount of energy that’s consumed in processing those transactions is staggering,” the former Fed chairwoman said. Yellen’s comments have been cited as a reason for bitcoin’s recent losses. However, Yellen’s assessment of bitcoin as a inefficient medium of exchange is an important point and one that has already been raised in the past by bitcoin bulls. Using a volatile asset in exchange for goods and services makes little sense if the asset can tumble 10% in a day, or surge 80% over the course of a two months as bitcoin has done in 2021, critics argue. To put a finer point on it, over the past 12 months bitcoin has registered 8 corrections, defined as a decline from a recent peak of at least 10% but not more than 20%, and two bear markets, which are defined as falls of 20% or more, according to Dow Jones Market Data.

Should You Buy Bitcoin?

In general, many financial experts support their clients’ desire to buy cryptocurrency, but they don’t recommend it unless clients express interest. “The biggest concern for us is if someone wants to invest in crypto and the investment they choose doesn’t do well, and then all of a sudden they can’t send their kids to college,” says Ian Harvey, a certified financial planner (CFP) in New York City. “Then it wasn’t worth the risk.” The speculative nature of cryptocurrency leads some planners to recommend it for clients’ “side” investments. “Some call it a Vegas account,” says Scott Hammel, a CFP in Dallas. “Let’s keep this away from our real long-term perspective, make sure it doesn’t become too large a portion of your portfolio.” In a very real sense, Bitcoin is like a single stock, and advisors wouldn’t recommend putting a sizable part of your portfolio into any one company. At most, planners suggest putting no more than 1% to 10% into Bitcoin if you’re passionate about it. “If it was one stock, you would never allocate any significant portion of your portfolio to it,” Hammel says.

C C Sharp programming from kr


Telegram C# (C Sharp) programming
FROM USA