Конечно - используйте split
, reduce
и filter
с %
(по модулю) для делимости:
const str = "The best 6 of 8 will get 9 points";
const strArr = str.split("");
const threesArr = strArr.filter(e => parseInt(e) % 3 == 0);
const sumOfThrees = threesArr.reduce((acc, curr) => acc + parseInt(curr), 0);
const allNumbers = strArr.filter(e => parseInt(e));
const lastNumber = allNumbers[allNumbers.length - 1];
console.log("Sum: " + sumOfThrees);
console.log("Last: " + lastNumber);
В .NET Framework нет ничего для поможет вам здесь, но этот пост дает довольно хорошую реализацию универсального ReadOnlyDictionary
на C #. Он реализует все интерфейсы, которые вы могли бы ожидать от него ( IDictionary
, ICollection
, IEnumerable
и т. Д.), И в качестве бонуса весь класс и его члены являются полностью прокомментирован с помощью XML.
(Я воздержался от размещения кода здесь, потому что он действительно довольно длинный со всеми комментариями XML.)
Полностью скрыть словарь. Просто предоставьте метод get для класса DictContainer, который извлекает элементы из словаря.
public class DictContainer
{
private readonly Dictionary<int, int> myDictionary;
public DictContainer()
{
myDictionary = GetDictionary();
}
private Dictionary<int, int> GetDictionary()
{
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(1, 2);
myDictionary.Add(2, 4);
myDictionary.Add(3, 6);
return myDictionary;
}
public this[int key]
{
return myDictionary[key];
}
}
и это другой способ
class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>
{
private bool _locked = false;
public new void Add(Key key, Value value)
{
if (!_locked)
{
base.Add(key, value);
}
else
{
throw new ReadOnlyException();
}
}
public void Lock()
{
_locked = true;
}
}
Э ... тогда не определяйте метод добавления ...
Сохраните переменную myDictionary
закрытой и предоставьте средство получения / индексирования, чтобы он мог только читать извне этого класса ..
задается вопросом, не упустил ли он смысл полностью
Для этого нет встроенного способа, рассмотрите возможность использования класса-оболочки.
interface IReadOnlyDic<Key, Value>
{
void Add(Key key, Value value);
}
class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>, IReadOnlyDic<Key, Value>
{
public new void Add(Key key, Value value)
{
//throw an exception or do nothing
}
#region IReadOnlyDic<Key,Value> Members
void IReadOnlyDic<Key, Value>.Add(Key key, Value value)
{
base.Add(key, value);
}
#endregion
}
для добавления настраиваемых элементов;
IReadOnlyDic<int, int> dict = myDictInstance as IReadOnlyDic<int, int>;
if (dict != null)
dict.Add(1, 155);
I liked the link from bruno-conde, which was a simpler one, but once I can't mark his comment as the answer, I'll mark Noldorin answer as the official, for it is a similar and satisfying answer.
Too bad there's not a way to prevent the code from compiling :(. Thanks, guys