Есть ли в C # класс для обработки пары INT (диапазон 2 INT- 1-10) - PullRequest
1 голос
/ 12 января 2012

Я довольно новичок в C #, и мне было интересно, есть ли класс или структура данных или лучший способ справиться со следующим требованием ... Мне нужно обработать пару из int, которая представляет диапазон данных (например,1 - 10 или 5-245), и мне нужен метод, чтобы проверить, содержится ли значение Int в диапазоне ... Я считаю, что в C # есть класс, встроенный в платформу для обработки моего требования ... что янужно проверить, содержится ли INT (например, 5) в диапазоне значений Eg (1-10) ...

в случае, если я обнаружу, что нет класса длясправиться с этим, я подумал пойти с Struct, который содержит 2 числа и сделать мой собственный метод Contain для проверки, если 5 содержится в диапазоне 1-10)

Ответы [ 6 ]

4 голосов
/ 12 января 2012

в случае, если я обнаружу, что нет класса для обработки это, я думал пойти со структурой, которая содержит 2 числа и сделать мой собственный метод Contain для проверки, если 5 содержится в диапазоне 1-10)

На самом деле это отличная идея, поскольку в BCL нет встроенного класса для вашего сценария.

2 голосов
/ 12 января 2012

Вы ищете тип диапазона;.Net Framework не включает его.

Вы должны создать неизменяемую (!) Int32Range структуру, как вы предлагали.
Возможно, вы захотите внедрить IEnumerable<int>, чтобы позволить пользователям легко проходить по циклам.числа в диапазоне.

Вы должны решить, должна ли каждая граница быть включающей или исключающей.
[Start, End), вероятно, является наиболее очевидным выбором.
Что бы вы ни выбрали, вы должны четко задокументировать это.в комментариях XML.

2 голосов
/ 12 января 2012

Ничего не существует, что точно соответствует вашим требованиям.

Если я вас правильно понял, написать класс довольно просто.

class Range
{
    public int Low {get; set;}
    public int High {get; set;}

    public bool InRange(int val) { return val >= Low && val <= High; }
}

A Tuple<int,int> поможет вам в этом, но вам придется добавить метод расширения, чтобы получить дополнительное поведение. Недостатком является то, что нижняя и верхняя границы неявно Item1 и Item2, что может сбить с толку.

// written off-the-cuff, may not compile
public static class TupleExtension
{
    public static bool InRange(Tuple<int, int> this, int queryFor)
    {
         return this.Item1 >= queryFor && this.Item2 <= queryFor;
    }
}
1 голос
/ 12 января 2012

Вы можете создать расширение, если хотите избежать создания нового типа:

public static class Extensions
{
  public static bool IsInRange(this int value, int min, int max)
  {
    return value >= min && value <= max;
  }
}

Тогда вы можете сделать что-то вроде:

if(!value.IsInRange(5, 545))
  throw new Exception("Value is out of range.");
0 голосов
/ 12 января 2012

Ничего не встроено в AFAIK, но (в зависимости от размера диапазона) будет работать Enumerable.Range (но он будет меньше оптимального, поскольку вы действительно сохраняете каждое значение в диапазоне, а не только конечные точки).Тем не менее, он позволяет вам использовать методы LINQ (включая Enumerable.Contains), что может пригодиться.

const int START = 5;
const int END = 245;

var r = Enumerable.Range(START, (END - START)); // 2nd param is # of integers
return r.Contains(100);

Лично я бы, вероятно, решил написать класс, поскольку он довольно прост(и вы всегда можете выставить итератор IEnumerable<int> через Enumerable.Range, если вы хотите выполнить над ним LINQ)

0 голосов
/ 12 января 2012

Я думаю, вы можете сделать это с массивом. несколько хороших примеров и объяснений можно найти здесь: http://www.dotnetperls.com/int-array

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...