<select name="GroupListID" class="btn btn-default dropdown-toggle" id="GroupListID">
<option value="">Select an Option</option>
<option value="3">Dx</option>
<option value="5">Group ID</option>
<option value="4">NPI</option>
<option value="6">Plan Code</option>
<option value="1">Px</option>
</select>
@Html.TextBoxFor(x => x.GroupTxt, new { @class = "form-control", @style = "width:100%" })
if (model.SelectedGroupID != null && model.GroupTxt != null)
list = list.Where(x => model.GroupTxt.Any(m => Equals(x.ConditionAttributesAndValues, m)));
// here I want to say
// and
// and if the user enter a range in the textbox then filter all that are within the range.
<br> IF Dx = aa (299.00,<br>299.01,<br>299.80,<br>299.81,<br>299.90,<br>299.91,<br>99999) <br> AND Dx Between Range (10 - 30) <br>(aa22)<br>"aa55"<br>
static bool InRange(string range, string source)
{
var bookends = range.Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var _range = Enumerable.Range(bookends.First(), bookends.LastOrDefault() == 0 ? 1 : bookends.Last());
var start = source.IndexOf("Dx Between Range (") + "Dx Between Range (".Length;
var end = source.IndexOf(")", start);
var values = source.Substring(start, end - start).Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var sourceRange = Enumerable.Range(values.First(), values.LastOrDefault() == 0 ? 1 : values.Last());
return _range.Intersect(sourceRange).Any();
}
Proof of concept -
using System;
using System.Linq;
namespace EE_Q29172573
{
class Program
{
static void Main(string[] args)
{
var attributes = new[]
{
"<br> IF Dx = aa (299.00,<br>299.01,<br>299.80,<br>299.81,<br>299.90,<br>299.91,<br>99999) <br> AND Dx Between Range (10 - 30) <br>(aa22)<br>\"aa55\"<br>",
"<br> IF Dx = aa (299.00,<br>299.01,<br>299.80,<br>299.81,<br>299.90,<br>299.91,<br>99999) <br> AND Dx Between Range (2 - 40) <br>(aa22)<br>\"aa55\"<br>",
"<br> IF Dx = aa (299.00,<br>299.01,<br>299.80,<br>299.81,<br>299.90,<br>299.91,<br>99999) <br> AND Dx Between Range (2 - 8) <br>(aa22)<br>\"aa55\"<br>",
"<br> IF Dx = aa (299.00,<br>299.01,<br>299.80,<br>299.81,<br>299.90,<br>299.91,<br>99999) <br> AND Dx Between Range (40 - 70) <br>(aa22)<br>\"aa55\"<br>"
};
foreach (var item in attributes.Where(x => InRange("10 - 30", x)))
{
Console.WriteLine(item);
}
Console.ReadLine();
}
static bool InRange(string range, string source)
{
var bookends = range.Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var _range = Enumerable.Range(bookends.First(), bookends.LastOrDefault() == 0 ? 1 : bookends.Last());
var start = source.IndexOf("Dx Between Range (") + "Dx Between Range (".Length;
var end = source.IndexOf(")", start);
var values = source.Substring(start, end - start).Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var sourceRange = Enumerable.Range(values.First(), values.LastOrDefault() == 0 ? 1 : values.Last());
return _range.Intersect(sourceRange).Any();
}
}
}
Which produces the following output -This is my code ;
public List<RuleDetail> RuleDetailList(CABRSearchRules model)
{
List<RuleDetail> modelList = new List<RuleDetail>();
IEnumerable<CABR_RuleDetail> list = new List<CABR_RuleDetail>();
IEnumerable<CABR_HistoryRuleDetail> Historylist = new List<CABR_HistoryRuleDetail>();
if (model.SelectedCurrentOrHistoryID == 1) //Current
{
list = _unitOfWorkCABusinessRules.RuleDetailRepo.GetAll().ToList();
//Filter Status
if (model.SelectedStatus != null)
list = list.Where(x => x.isActive == model.SelectedStatus);
//Filter Created Date
if (model.FromCreatedDate.ToString() != "1/1/0001 12:00:00 AM" && model.ToCreatedDate.ToString() != "1/1/0001 12:00:00 AM")
list = list.Where(x => x.CreatedDate.Date >= model.FromCreatedDate.Date && x.CreatedDate.Date <= model.ToCreatedDate.Date);
//Filter Migration Date
if (model.FromMigrationDate.ToString() != "1/1/0001 12:00:00 AM" && model.ToMigrationDate.ToString() != "1/1/0001 12:00:00 AM")
list = list.Where(x => x.MigrationDate.Date >= model.FromMigrationDate.Date && x.MigrationDate.Date <= model.ToMigrationDate.Date);
//Filter Migration Date
if (model.RuleDescription != null)
list = list.Where(x => x.RuleDescription.Contains(model.RuleDescription));
//Filter Condition Attributes And Values
if (model.ConditionAttributesAndValues != null)
list = list.Where(x => x.ConditionAttributesAndValues.Contains(model.ConditionAttributesAndValues));
//Filter Selected Function
if (model.SelectedFunction != null)
list = list.Where(x => model.SelectedFunction.Any(x.ConditionAttributesAndValues.Contains));
//Filter FunctionTxt
if (model.FunctionTxt != null)
list = list.Where(x => x.ConditionAttributesAndValues.ToLower().Contains(model.FunctionTxt.ToLower()));
//Filter Selected Group
if (model.SelectedGroup != null)
list = list.Where(x => model.SelectedGroup.Any(x.ConditionAttributesAndValues.Contains));
//Filter Group Txt
if (model.GroupTxt != null && !model.GroupTxt.Contains("-"))
list = list.Where(x => x.ConditionAttributesAndValues.ToLower().Contains(model.GroupTxt.ToLower()));
//Here I want to say get all the records that are within the "Range" that is in the field ConditionAttirbutesAndValues
}
var GetRuleset = _unitOfWorkCABusinessRules.RuleSetRepo.GetAll()
.Where(x => x.IsActive == true).ToList();
var GetRuleIdentifier = _unitOfWorkCABusinessRules.RuleIdentifierRepo.GetAll()
.Where(x => x.IsActive == true).ToList();
modelList = list.ToList().Select(x => new RuleDetail
{
Status = (Boolean)x.isActive,
RuleSet = GetRuleset.Where(a => a.RuleSetId == x.RuleSetId).FirstOrDefault().RuleSet,
RuleIdentifier = GetRuleIdentifier.Where(a => a.RuleIdentifierId == x.RuleIdentifierId).FirstOrDefault().RuleIdentifier,
Versions = x.Version,
Environments = x.Environment,
CommitID = x.CommitID,
CommitDescription = x.CommitDescription,
RuleDescription = x.CommitDescription,
ConditionAttributesAndValues = x.ConditionAttributesAndValues,
ActionAttributesAndValues = x.ActionAttributesAndValues,
CommentOrNotes = x.CommentOrNotes,
MigrationDate = x.MigrationDate,
CreatedDate = x.CreatedDate,
SubmitterLastNameFirstName = x.SubmitterLastNameFirstName,
CQTicket = x.CQTicket
}).ToList();
return modelList;
}
if (model.GroupTxt != null && model.GroupTxt.Contains("-"))
list = list.Where(x => InRange(model.GroupTxt, x));
And then somewhere else in your codebase (maybe even after the method you are working in) place the InRange method:
private bool InRange(string range, string source)
{
var bookends = range.Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var _range = Enumerable.Range(bookends.First(), bookends.LastOrDefault() == 0 ? 1 : bookends.Last());
var start = source.IndexOf("Dx Between Range (") + "Dx Between Range (".Length;
var end = source.IndexOf(")", start);
var values = source.Substring(start, end - start).Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var sourceRange = Enumerable.Range(values.First(), values.LastOrDefault() == 0 ? 1 : values.Last());
return _range.Intersect(sourceRange).Any();
}
-saige-
I put x.ToString() because I got an error that says
Cannot convert 'CareAdvanceBusinessRules.Data.CABR_RuleDetail' to 'String'
if (model.GroupTxt != null && model.GroupTxt.Contains("-"))
list = list.Where(x => InRange(model.GroupTxt, x.ToString()));
private bool InRange(string range, string source)
{
var bookends = range.Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var _range = Enumerable.Range(bookends.First(), bookends.LastOrDefault() == 0 ? 1 : bookends.Last());
var start = source.IndexOf("Dx Between Range (") + "Dx Between Range (".Length;
var end = source.IndexOf(")", start);
var values = source.Substring(start, end - start).Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var sourceRange = Enumerable.Range(values.First(), values.LastOrDefault() == 0 ? 1 : values.Last());
return _range.Intersect(sourceRange).Any();
}
if (model.GroupTxt != null && model.GroupTxt.Contains("-"))
list = list.Where(x => InRange(model.GroupTxt, x.ConditionAttributesAndValues));
Also might want to add a check to ensure that our start and end make sense;
private bool InRange(string range, string source)
{
var bookends = range.Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var _range = Enumerable.Range(bookends.First(), bookends.LastOrDefault() == 0 ? 1 : bookends.Last());
var start = source.IndexOf("Dx Between Range (") + "Dx Between Range (".Length;
var end = source.IndexOf(")", start);
if (start == -1 || end == -1)
{
return false;
}
var values = source.Substring(start, end - start).Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var sourceRange = Enumerable.Range(values.First(), values.LastOrDefault() == 0 ? 1 : values.Last());
return _range.Intersect(sourceRange).Any();
}
-saige-
string range is returning this:
F05-F09
string source is returning this:
<br> IF Px IN Actigraphy (0089T,<br>0124T,<br>53860,<br>90620,<br>96904,<br>J2325,<br>M0075,<br>S8040,<br>S8940,)
the error is happening on this line:
var bookends = range.Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
Convert.ToInt32(x.Trim())) - > that is where the error
private bool InRange(string range, string source)
{
var bookends = range.Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var _range = Enumerable.Range(bookends.First(), bookends.LastOrDefault() == 0 ? 1 : bookends.Last());
var start = source.IndexOf("Dx Between Range (") + "Dx Between Range (".Length;
var end = source.IndexOf(")", start);
if (start == -1 || end == -1)
{
return false;
}
var values = source.Substring(start, end - start).Split('-').Select(x => Convert.ToInt32(x.Trim())).OrderBy(x => x);
var sourceRange = Enumerable.Range(values.First(), values.LastOrDefault() == 0 ? 1 : values.Last());
return _range.Intersect(sourceRange).Any();
}
private bool InRange(string search, string source)
{
var result = default(bool);
var start = default(int);
var end = default(int);
var searchRange = default(Dictionary<string, IEnumerable<int>>);
var sourceRange = default(Dictionary<string, IEnumerable<int>>);
try
{
start = source.IndexOf("BetweenRange(", StringComparison.OrdinalIgnoreCase) + "BetweenRange(".Length;
end = source.IndexOf(")", start);
searchRange = GetRangeDictionary(search);
sourceRange = GetRangeDictionary(source.Substring(start, end - start));
result = (from lhs in searchRange
from rhs in sourceRange
where Equals(lhs.Key, rhs.Key)
select lhs.Value.Intersect(rhs.Value)).Any();
}
catch (Exception ex)
{
// Ideally you would log some message to let you know that this failed
//Console.WriteLine($"Message: {ex.Message}{Environment.NewLine}{ex.StackTrace}");
result = false;
}
return result;
}
private Dictionary<string, IEnumerable<int>> GetRangeDictionary(string source)
{
var result = default(Dictionary<string, IEnumerable<int>>);
try
{
result = source.Split('-')
.Select(x => new KeyValuePair<string, int>(Regex.Match(x, @"\D+")?.Value ?? string.Empty, Convert.ToInt32(Regex.Match(x, @"\d+")?.Value ?? "0")))
.OrderBy(x => x.Value)
.GroupBy(x => x.Key)
.Select(x => new KeyValuePair<string, IEnumerable<int>>(x.Key, Enumerable.Range(x.First().Value, x.LastOrDefault().Value == 0 ? 1 : x.Last().Value - x.First().Value + 1)))
.ToDictionary(x => x.Key, x => x.Value);
}
catch (Exception ex)
{
// Ideally you would log a message to let you know that this failed
//Console.WriteLine($"Message: {ex.Message}{Environment.NewLine}{ex.StackTrace}");
result = new Dictionary<string, IEnumerable<int>>();
}
return result;
}
Proof of concept -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace EE_Q29172573
{
class Program
{
static void Main(string[] args)
{
var attributes = new[]
{
"<br> IF Px IN Actigraphy (0089T,<br>0124T,<br>53860,<br>90620,<br>96904,<br>J2325,<br>M0075,<br>S8040,<br>S8940,)",
"<br> IF Dx IN Acute_Pancreatitis <br>K85.12,<br>K85.2,<br>K85.20,<br>K85.21,<br>K85.3) Select<br> AND Px Between Range(M4445 - M5644) < br>(aa22)<br>\"aa55\"<br>",
"<br> Dx Between Range (1 - 30) <br>(aa22)<br>\"aa55\"<br>",
"<br> F Dx IN aa (299.00,<br>299.01,<br>299.80,<br>299.81,<br>299.90,<br>299.91,<br>99999) <br> AND Dx Between Range (F01 - F99) <br>(aa22)<br>\"aa55\"<br>",
"<br> IF Px Not IN Actigraphy (0089T,<br>0124T,<br>S8040,<br>S8940,) <br> AND NPI IN NPI_001 (1417941774) <br>(aa22)<br>\"aa55\"<br>"
};
foreach (var search in new[] { "10 - 30", "F98 - F200", "M4976 - M6000" })
{
foreach (var item in attributes.Where(x => x.Replace(" ", "").IndexOf("BetweenRange(", StringComparison.OrdinalIgnoreCase) > -1 ? InRange(search.Replace(" ", ""), x.Replace(" ", "")) : false))
{
Console.WriteLine(item);
}
}
Console.ReadLine();
}
static bool InRange(string search, string source)
{
var result = default(bool);
var start = default(int);
var end = default(int);
var searchRange = default(Dictionary<string, IEnumerable<int>>);
var sourceRange = default(Dictionary<string, IEnumerable<int>>);
try
{
start = source.IndexOf("BetweenRange(") + "BetweenRange(".Length;
end = source.IndexOf(")", start);
searchRange = GetRangeDictionary(search);
sourceRange = GetRangeDictionary(source.Substring(start, end - start));
result = (from lhs in searchRange
from rhs in sourceRange
where Equals(lhs.Key, rhs.Key)
select lhs.Value.Intersect(rhs.Value)).Any();
}
catch (Exception ex)
{
Console.WriteLine($"Message: {ex.Message}{Environment.NewLine}{ex.StackTrace}");
result = false;
}
return result;
}
static Dictionary<string, IEnumerable<int>> GetRangeDictionary(string source)
{
var result = default(Dictionary<string, IEnumerable<int>>);
try
{
result = source.Split('-')
.Select(x => new KeyValuePair<string, int>(Regex.Match(x, @"\D+")?.Value ?? string.Empty, Convert.ToInt32(Regex.Match(x, @"\d+")?.Value ?? "0")))
.OrderBy(x => x.Value)
.GroupBy(x => x.Key)
.Select(x => new KeyValuePair<string, IEnumerable<int>>(x.Key, Enumerable.Range(x.First().Value, x.LastOrDefault().Value == 0 ? 1 : x.Last().Value - x.First().Value + 1)))
.ToDictionary(x => x.Key, x => x.Value);
}
catch (Exception ex)
{
Console.WriteLine($"Message: {ex.Message}{Environment.NewLine}{ex.StackTrace}");
result = new Dictionary<string, IEnumerable<int>>();
}
return result;
}
}
}
Produces the following output -if (model.GroupTxt != null && model.GroupTxt.Contains("-"))
list = list.Where(x => InRange(model.GroupTxt, x.ConditionAttributesAndValues));
To this:
if (model.GroupTxt != null && model.GroupTxt.Contains("-"))
list = list.Where(x => InRange(model.GroupTxt.Replace(" ", ""), x.ConditionAttributesAndValues.Replace(" ", "")));
If you want to see if your ConditionAttributeAndValueif (model.GroupTxt != null && model.GroupTxt.Contains("-"))
list = list.Where(x => x.ConditionAttributesAndValues.Replace(" ", "").IndexOf("BetweenRange(", StringComparison.OrdinalIgnoreCase) > -1 ? InRange(model.GroupTxt.Replace(" ", ""), x.ConditionAttributesAndValues.Replace(" ", "")) : false);
Also don't forget to replace the InRange method with the new one and add the GetRangeDictionary method. if (model.GroupTxt != null && model.GroupTxt.Contains("-"))
list = list.Where(x => InRange(model.GroupTxt.Replace(" ", ""), x.ConditionAttributesAndValues.Replace(" ", "")));
private bool InRange(string search, string source)
{
var result = default(bool);
var start = default(int);
var end = default(int);
var searchRange = default(Dictionary<string, IEnumerable<int>>);
var sourceRange = default(Dictionary<string, IEnumerable<int>>);
try
{
start = source.IndexOf("BetweenRange(", StringComparison.OrdinalIgnoreCase) + "BetweenRange(".Length;
end = source.IndexOf(")", start);
searchRange = GetRangeDictionary(search);
sourceRange = GetRangeDictionary(source.Substring(start, end - start));
result = (from lhs in searchRange
from rhs in sourceRange
where Equals(lhs.Key, rhs.Key)
select lhs.Value.Intersect(rhs.Value)).Any();
}
catch (Exception e)
{
// Ideally you would log some message to let you know that this failed
//Console.WriteLine($"Message: {ex.Message}{Environment.NewLine}{ex.StackTrace}");
result = false;
}
return result;
}
private Dictionary<string, IEnumerable<int>> GetRangeDictionary(string source)
{
var result = default(Dictionary<string, IEnumerable<int>>);
try
{
result = source.Split('-')
.Select(x => new KeyValuePair<string, int>(Regex.Match(x, @"\D+")?.Value ?? string.Empty, Convert.ToInt32(Regex.Match(x, @"\d+")?.Value ?? "0")))
.OrderBy(x => x.Value)
.GroupBy(x => x.Key)
.Select(x => new KeyValuePair<string, IEnumerable<int>>(x.Key, Enumerable.Range(x.First().Value, x.LastOrDefault().Value == 0 ? 1 : x.Last().Value - x.First().Value + 1)))
.ToDictionary(x => x.Key, x => x.Value);
}
catch (Exception e)
{
// Ideally you would log a message to let you know that this failed
//Console.WriteLine($"Message: {ex.Message}{Environment.NewLine}{ex.StackTrace}");
result = new Dictionary<string, IEnumerable<int>>();
}
return result;
}
If the user enters text into the text box; e.g. - 10 - 30, you want to see if the text enter is contained inside Dx Between Range (x - x ) in the ConditionAttributesAndValu
-saige-