v10.10.2024.0701 使用IJsonHost改进Json序列化
大石头 编写于 2024-07-01 08:36:34 大石头 提交于 2024-07-01 08:48:33
X
using System.Collections.Generic;

namespace System.Collections.Concurrent;

public abstract class OrderablePartitioner<TSource> : Partitioner<TSource>
{
	private class ProxyEnumerator : IEnumerator<TSource>, IEnumerator, IDisposable
	{
		private IEnumerator<KeyValuePair<long, TSource>> internalEnumerator;

		object IEnumerator.Current => Current;

		public TSource Current { get; private set; }

		internal ProxyEnumerator(IEnumerator<KeyValuePair<long, TSource>> enumerator)
		{
			internalEnumerator = enumerator;
		}

		public void Dispose()
		{
			internalEnumerator.Dispose();
		}

		public bool MoveNext()
		{
			if (!internalEnumerator.MoveNext())
			{
				return false;
			}
			Current = internalEnumerator.Current.Value;
			return true;
		}

		public void Reset()
		{
			internalEnumerator.Reset();
		}
	}

	private bool keysOrderedInEachPartition;

	private bool keysOrderedAcrossPartitions;

	private bool keysNormalized;

	public bool KeysOrderedInEachPartition => keysOrderedInEachPartition;

	public bool KeysOrderedAcrossPartitions => keysOrderedAcrossPartitions;

	public bool KeysNormalized => keysNormalized;

	protected OrderablePartitioner(bool keysOrderedInEachPartition, bool keysOrderedAcrossPartitions, bool keysNormalized)
	{
		this.keysOrderedInEachPartition = keysOrderedInEachPartition;
		this.keysOrderedAcrossPartitions = keysOrderedAcrossPartitions;
		this.keysNormalized = keysNormalized;
	}

	public override IEnumerable<TSource> GetDynamicPartitions()
	{
		foreach (KeyValuePair<long, TSource> item in GetOrderableDynamicPartitions())
		{
			KeyValuePair<long, TSource> keyValuePair = item;
			yield return keyValuePair.Value;
		}
	}

	public override IList<IEnumerator<TSource>> GetPartitions(int partitionCount)
	{
		IEnumerator<TSource>[] array = new IEnumerator<TSource>[partitionCount];
		IList<IEnumerator<KeyValuePair<long, TSource>>> orderablePartitions = GetOrderablePartitions(partitionCount);
		for (int i = 0; i < orderablePartitions.Count; i++)
		{
			array[i] = new ProxyEnumerator(orderablePartitions[i]);
		}
		return array;
	}

	private IEnumerator<TSource> GetProxyEnumerator(IEnumerator<KeyValuePair<long, TSource>> enumerator)
	{
		while (enumerator.MoveNext())
		{
			yield return enumerator.Current.Value;
		}
	}

	public abstract IList<IEnumerator<KeyValuePair<long, TSource>>> GetOrderablePartitions(int partitionCount);

	public virtual IEnumerable<KeyValuePair<long, TSource>> GetOrderableDynamicPartitions()
	{
		if (!SupportsDynamicPartitions)
		{
			throw new NotSupportedException();
		}
		return null;
	}
}