Пример с кодом, возможно.
Здесь, ConcreteRegistry является одиночным элементом в игре в покер, которая предоставляет поведениям полностью доступ дерева пакета некоторые, базовые интерфейсы игры (т.е. фасады для модели, представления, контроллера, среды, и т.д.):
http://www.edmundkirwan.com/servlet/fractal/cs1/frac-cs40.html
Ed.
Методы расширения ?
bool Between(this int value, int left, int right)
{
return value > left && value < right;
}
if(x.Between(4199, 6800) || x.Between(6999, 8200) || ...)
Вы также можете сделать этот ужасный хак:
bool Between(this int value, params int[] values)
{
// Should be even number of items
Debug.Assert(values.Length % 2 == 0);
for(int i = 0; i < values.Length; i += 2)
if(!value.Between(values[i], values[i + 1])
return false;
return true;
}
if(x.Between(4199, 6800, 6999, 8200, ...)
Ужасный хак, улучшенный:
class Range
{
int Left { get; set; }
int Right { get; set; }
// Constructors, etc.
}
Range R(int left, int right)
{
return new Range(left, right)
}
bool Between(this int value, params Range[] ranges)
{
for(int i = 0; i < ranges.Length; ++i)
if(value > ranges[i].Left && value < ranges[i].Right)
return true;
return false;
}
if(x.Between(R(4199, 6800), R(6999, 8200), ...))
Или, еще лучше (это не позволяет дублировать нижние границы):
bool Between(this int value, Dictionary<int, int> ranges)
{
// Basically iterate over Key-Value pairs and check if value falls within that range
}
if(x.Between({ { 4199, 6800 }, { 6999, 8200 }, ... }
Подход LINQ:
Добавьте ссылку:
using System.Linq;
/// <summary>
/// Test to see if value is in specified range.
/// </summary>
/// <param name="aStart">int</param>
/// <param name="aEnd">int</param>
/// <param name="aValueToTest">int</param>
/// <returns>bool</returns>
public static bool CheckValueInRange(int aStart, int aEnd, int aValueToTest)
{
// check value in range...
bool ValueInRange = Enumerable.Range(aStart, aEnd).Contains(aValueToTest);
// return value...
return ValueInRange;
}
Определите тип диапазона, затем создайте набор диапазонов и метод расширения, чтобы увидеть, находится ли значение в любом из диапазоны. Затем вместо жесткого кодирования значений вы можете создать коллекцию диапазонов и, возможно, несколько отдельных диапазонов, дав им полезные имена, чтобы объяснить , почему они вам интересны:
static readonly Range InvalidUser = new Range(100, 200);
static readonly Range MilkTooHot = new Range (300, 400);
static readonly IEnumerable<Range> Errors =
new List<Range> { InvalidUser, MilkTooHot };
...
// Normal LINQ (where Range defines a Contains method)
if (Errors.Any(range => range.Contains(statusCode))
// or (extension method on int)
if (statusCode.InAny(Errors))
// or (extension methods on IEnumerable<Range>)
if (Errors.Any(statusCode))
Возможно, вас заинтересуют общий тип Range
, который является частью MiscUtil . Он также позволяет выполнять итерацию простым способом:
foreach (DateTime date in 19.June(1976).To(25.December(2005)).Step(1.Days()))
{
// etc
}
(Очевидно, что также используются некоторые методы расширения, связанные с DateTime / TimeSpan, но вы поняли идею.)
затем создайте набор диапазонов и метод расширения, чтобы увидеть, находится ли значение в каком-либо из диапазонов. Затем вместо жесткого кодирования значений вы можете создать коллекцию диапазонов и, возможно, несколько отдельных диапазонов, дав им полезные имена, чтобы объяснить , почему они вам интересны:static readonly Range InvalidUser = new Range(100, 200);
static readonly Range MilkTooHot = new Range (300, 400);
static readonly IEnumerable<Range> Errors =
new List<Range> { InvalidUser, MilkTooHot };
...
// Normal LINQ (where Range defines a Contains method)
if (Errors.Any(range => range.Contains(statusCode))
// or (extension method on int)
if (statusCode.InAny(Errors))
// or (extension methods on IEnumerable<Range>)
if (Errors.Any(statusCode))
Возможно, вас заинтересуют общий тип Range
, который является частью MiscUtil . Он также позволяет выполнять итерацию простым способом:
foreach (DateTime date in 19.June(1976).To(25.December(2005)).Step(1.Days()))
{
// etc
}
(Очевидно, что также используются некоторые методы расширения, связанные с DateTime / TimeSpan, но вы поняли идею.)
затем создайте набор диапазонов и метод расширения, чтобы увидеть, находится ли значение в каком-либо из диапазонов. Затем вместо жесткого кодирования значений вы можете создать коллекцию диапазонов и, возможно, несколько отдельных диапазонов, дав им полезные имена, чтобы объяснить , почему они вам интересны:static readonly Range InvalidUser = new Range(100, 200);
static readonly Range MilkTooHot = new Range (300, 400);
static readonly IEnumerable<Range> Errors =
new List<Range> { InvalidUser, MilkTooHot };
...
// Normal LINQ (where Range defines a Contains method)
if (Errors.Any(range => range.Contains(statusCode))
// or (extension method on int)
if (statusCode.InAny(Errors))
// or (extension methods on IEnumerable<Range>)
if (Errors.Any(statusCode))
Возможно, вас заинтересуют общий тип Range
, который является частью MiscUtil . Он также позволяет выполнять итерацию простым способом:
foreach (DateTime date in 19.June(1976).To(25.December(2005)).Step(1.Days()))
{
// etc
}
(Очевидно, что также используются некоторые методы расширения, связанные с DateTime / TimeSpan, но вы поняли идею.)
static readonly Range InvalidUser = new Range(100, 200);
static readonly Range MilkTooHot = new Range (300, 400);
static readonly IEnumerable<Range> Errors =
new List<Range> { InvalidUser, MilkTooHot };
...
// Normal LINQ (where Range defines a Contains method)
if (Errors.Any(range => range.Contains(statusCode))
// or (extension method on int)
if (statusCode.InAny(Errors))
// or (extension methods on IEnumerable<Range>)
if (Errors.Any(statusCode))
Возможно, вас заинтересует общий тип Range
, который является частью MiscUtil . Он также позволяет выполнять итерацию простым способом:
foreach (DateTime date in 19.June(1976).To(25.December(2005)).Step(1.Days()))
{
// etc
}
(Очевидно, что также используются некоторые методы расширения, связанные с DateTime / TimeSpan, но вы поняли идею.)
static readonly Range InvalidUser = new Range(100, 200);
static readonly Range MilkTooHot = new Range (300, 400);
static readonly IEnumerable<Range> Errors =
new List<Range> { InvalidUser, MilkTooHot };
...
// Normal LINQ (where Range defines a Contains method)
if (Errors.Any(range => range.Contains(statusCode))
// or (extension method on int)
if (statusCode.InAny(Errors))
// or (extension methods on IEnumerable<Range>)
if (Errors.Any(statusCode))
Возможно, вас заинтересует общий тип Range
, который является частью MiscUtil . Он также позволяет выполнять итерацию простым способом:
foreach (DateTime date in 19.June(1976).To(25.December(2005)).Step(1.Days()))
{
// etc
}
(Очевидно, что также используются некоторые методы расширения, связанные с DateTime / TimeSpan, но вы поняли идею.)
если вам нужно перебрать пары значений в какой-то момент, я предлагаю вам зафиксировать максимальное нижнее значение и минимальное верхнее значение, как вы это делаете, в переменных и сделать:
if ( x>max_lower && x <min_upper)
{
// More awesome code
}
class Range {
public Range(int x, int y) {
X = x;
Y = y;
}
public int X { get; set; }
public int Y { get; set; }
}
var ranges = new List<Range>();
ranges.Add(new Range(4199,6800));
ranges.Add(new Range(6999,8200));
ranges.Add(new Range(9999,10100));
ranges.Add(new Range(10999,11100));
ranges.Add(new Range(11999,12100));
bool inRange = ranges.Count(r => x >= r.X && x <= r.Y) > 0;
//or -- Based on Jons recommendation
bool inRange = ranges.Any(r => x >= r.X && x <= r.Y);
Я лично предпочитаю метод расширения, предложенный @Anton, но если вы не можете этого сделать и собираетесь придерживаться своего текущего кода, я думаю, вы могли бы сделать его более читаемым, изменив первый набор условий в каждой строке выглядит следующим образом ...
int x = 500; // Could be any number
if ( ( 4199 < x && x < 6800 ) ||
( 6999 < x && x < 8200 ) ||
( 9999 < x && x < 10100 ) ||
( 10999 < x && x < 11100 ) ||
( 11999 < x && x < 12100 ) )
{
// More awesome code
}
Попробуйте что-нибудь вроде:
struct Range
{
public readonly int LowerBound;
public readonly int UpperBound;
public Range( int lower, int upper )
{ LowerBound = lower; UpperBound = upper; }
public bool IsBetween( int value )
{ return value >= LowerBound && value <= UpperBound; }
}
public void YourMethod( int someValue )
{
List<Range> ranges = {new Range(4199,6800),new Range(6999,8200),
new Range(9999,10100),new Range(10999,11100),
new Range(11999,12100)};
if( ranges.Any( x => x.IsBetween( someValue ) )
{
// your awesome code...
}
}