0
votes

Trouver la plage dans une liste de gamme C #

J'ai cette gamme de prix, formée dans une chaîne comme celle-ci:

100: 105, 110: 120, 150: 200, 240: 245

Ceci signifie Les prix vont de

100 à 105

et

110 à 120

et

150 à 200

et

240 à 245

Je veux vérifier si une nouvelle gamme de prix est dans notre gamme de prix acceptable. Voici mon code jusqu'à présent: xxx

Ce code fonctionne si le début du début et de l'extrémité correspond au début et à la fin de la plage.

Par exemple, Si ibegin = 110 et iend = 120 , mon code le trouvera en fonction de si 110: 120 existe dans la liste.

Cependant, si le iend = 115 il ne le trouvera pas.


1 commentaires

Si possible, je conseillerais de travailler avec des chaînes délimitées. Si vous devez travailler avec des chaînes comme votre contribution, vous ferez mieux de travailler avec un format bien connu pouvant être validé tel que JSON ou XML.


3 Réponses :


0
votes

Vous devez diviser les gammes, analyser les chiffres et les vérifier:

var search = new {from = 110, to= 115};
var found = "100:105,110:120,150:200,240:245"
    .Split(',') //split in parts like 100:105
    .Select(p => {
        var parts = p.Split(':'); // split the range from/to
        var from = int.Parse(parts[0]); //convert from/to to ints
        var to = int.Parse(parts[1]);
        return new { from, to };
    })
    //check if any range matches the search values
    .Any(range => search.from >= range.from && search.to <= range.to);

Console.WriteLine($"Found: {found}");


1 commentaires

Et espérons-le, pas le scission et l'analyse de chaque fois que vous devez vérifier une nouvelle gamme.



0
votes
bool IsInRange(int ibegin, int iend, string BeginEnd)
{
    string[] strBeginEnd = BeginEnd.Split(',');

    foreach (var range in strBeginEnd)
    {
        var rangeArray = range.Split(':');
        if (ibegin >= int.Parse(rangeArray[0]) && iend <= int.Parse(rangeArray[1]))
        {
            return true;
        }
    }
    return false;
}

0 commentaires

0
votes
 public static void Main(string[] args) {
            string BeginEnd = "100:105,110:120,150:200,240:245";
            Dictionary<string, int[]> data = new Dictionary<string, int[]>();
            foreach (var val in BeginEnd.Split(",")) {
                var start = int.Parse(val.Split(":")[0]);
                var end = int.Parse(val.Split(":")[1]);
                var range = new int[end - start+1];
                for (var i = 0; i < range.Length; i++) {
                    range[i] = start + i;
                }
                data.Add(val, range);
            }

            var test1 = check(110);
            var test2 = check(115);
            var test3 = check(200);
            var test4 = check(240);

            Console.WriteLine("test1 {0} ,test2 {1} ,test3 {2} ,test4 {3}  ",test1,test2,test3,test4);
            string check(int value) => data.FirstOrDefault(pair => pair.Value.Contains(value)).Key;
        }

0 commentaires