Bir satr faqat raqamlar bilan mavjudmi? (LINQ)

LINQ so'rovim bor va 1000 dan 2000 yilgacha bo'lgan bir necha zipkodlar oralig'idagi manzillarga ega bo'lishni xohlayman. "3456 AB" qiymatiga ega zipcode qanday topsam bo'ladi (faqat 4 ta birinchi belgini tekshirib ko'raman) ) faqat raqamlar mavjudmi?

var address = address.Where(p => p.Zipcode != null
                                && p.Zipcode.Length > 4 
                                && p.Zipcode.Substring(0, 4).Isnumber() 
                                && Convert.ToInt32(p.Zipcode.Substring(0, 4)) > zipcodeFrom);

Rahmat...

0
Sizning ishingiz yo'qmi? Yoki savol nimani anglatadi?
qo'shib qo'ydi muallif HimBromBeere, manba
Xotirada, SQL Serverda yoki boshqa bazalarda bormi?
qo'shib qo'ydi muallif Marco, manba
"SECR" - bu raqam emas ...
qo'shib qo'ydi muallif user1531040, manba
Kutilgan kirish va chiqishning oddiy misolini keltira olasizmi? Sizning savolingiz aniq emas.
qo'shib qo'ydi muallif TVOHM, manba

7 javoblar

Birinchi to'rtta belgining 1000 dan 2000 gacha bo'lgan raqamni tekshirish uchun Regex-dan foydalanishingiz mumkin. Bu sizning fikringizni soddalashtiradi:

var address = address.Where(p => p.Zipcode != null
    && Regex.Match(p.Zipcode, @"^[12]\d{3}").Success);
2
qo'shib qo'ydi
Regex katta va ajralmasdir, ammo bunday oson sharoitda algoritm o'z ta'sirini ko'rsatadigan ta'sirga ega bo'lishga hojat yo'q.
qo'shib qo'ydi muallif ensisNoctis, manba

Siz faqat TryParse dan foydalaning, agar u mag'lubiyatga int ga aylantirilsa bool qaytaradi.

Quyidagi holatlarda test qilish uchun ba'zi qo'g'irchoq ma'lumotlar:

var addresses = new[]
{
    new { Zipcode = "3456 AB" },//These of course have other fields,
    new { Zipcode = "345678"  },//but in this example we only care
    new { Zipcode = "876543"  },//about Zipcode
    new { Zipcode = "X3456"   },
    new { Zipcode = "5000 GG" },
};

So'rov:

    int zipcodeFrom = 4000;
    int parsedZipcode;

    var qualifiedAddresses = addresses
        .Where(p => true
            && p.Zipcode != null
            && p.Zipcode.Length >= 4
            && int.TryParse(p.Zipcode.Substring(0, 4), out parsedZipcode)
            && parsedZipcode > zipcodeFrom
        );

Chiqish:

876543 
5000 GG 
2
qo'shib qo'ydi
qaerda (p => rost && ...) ???
qo'shib qo'ydi muallif HimBromBeere, manba
Nima uchun qo'g'irchoq kodini qayta ishlatmaysiz? Sizga Convert.ToInt32 shart emas
qo'shib qo'ydi muallif xanatos, manba
rost && :-) dan foydalanish juda yoqadi. Aks holda -999 ABCD joriy bo'lishi uchun uint dan foydalanishni unutmang.
qo'shib qo'ydi muallif xanatos, manba
@xonatos - bu haqiqat, men ikki marta ajralish ishlarini qilar edim. O'zgaruvchining uzunligi "qo'g'irchoq" dir, shunday emasmi? ;)
qo'shib qo'ydi muallif ensisNoctis, manba
Bu shartlarni o'qiy olish uchun - endi siz ulardan bironta sharhlashingiz mumkin, chunki ularning har biri o'z satriga ega, ular hizalanadi (hatto birinchi holat: hozirda birinchi shart: true ) va bu natijani o'zgartirmaydi ), shuningdek, ularning barchasiga izoh berganingizda, u true tufayli hamon kuchga ega. Mantiqiy ORni hizalamoqchi bo'lsangiz, siz false dan foydalanasiz.
qo'shib qo'ydi muallif ensisNoctis, manba

Misol uchun:

var valid = adress.Where(x => x.ZipCode != null)
    .Select(x => x.ZipCode)
    .Where(x => x.Take(4).All(Char.IsDigit));

Where -clause, har bir ZipCode kodining to'rtta birinchi harfini tekshiradi. Take (4) dan foydalanganingizda siz faqatgina mag'lubiyatga emas, balki char turidagi ro'yxatga olishni olasiz. Shunday qilib, siz faqatgina x.IsDigit </body> </body> </body>

1
qo'shib qo'ydi
Menimcha, 1000 va 2000 yillar orasida zipkodlarni qanday olish haqida so'raydi, birinchi 4 ta rekordni olmaysiz
qo'shib qo'ydi muallif Ikram Turgunbaev, manba
var valid = addresses
    .Where(a => 
        a.Zipcode != null 
        && a.Zipcode.Length > 4 
        && a.Zipcode.Substring(0, 4).All(char.IsDigit))
    .Select(a => new { Address = a, Zipcode = Convert.ToInt32(a.Zipcode.Substring(0, 4)) })
    .Where(a => a.Zipcode >= 1000 && a.Zipcode <= 2000)
    .Select(a => a.Address);

Dastlabki tekshiruvlaringizni davom ettirish - dastlab Zipcode null bo'lgan barcha manzillarni filtrlaymiz, uzunligi 4dan kam yoki birinchi 4 ta belgidan iborat barcha raqamlar bo'lmaydi.

Biz manzilni va 4 raqamli Lokomotifni int sifatida o'z ichiga olgan anonim turdagi yangi qatorni loyihamiz. Keyinchalik, biz int-Zip kodining kerakli oraliqda ekanligini tekshirish orqali ushbu to'plamni filtrlashimiz mumkin. Nihoyat, asl manzillarini qaytarib olamiz.

1
qo'shib qo'ydi

Siz 4 raqamli satrga mos kelishingiz va uni ajralishingiz mumkin.

var resultString = int.Parse(
    Regex.Match(zip, @"\d{4}").Value
    );

Agar siz Linq ekvivalentini xohlasangiz

var linqEquiv = zip.Select((c, i) =>
  String.Join("",zip.Skip(i).Take(4))).FirstOrDefault(zip => 
    { int i; return int.TryParse(zip, out i) && i >= 1000 && i <= 2000 ; });

Nihoyat, sinf ta'rifi bilan

var linqEquivalent = address.Where(a => a.ZipCode.ToArray().Select((c, i) =>
    String.Join("", a.ZipCode.ToArray().Skip(i).Take(4))).FirstOrDefault(zip =>
        { int i; return int.TryParse(zip, out i) && i >= 1000 && i <= 2000; }) != null);

sinov ishi

Quyidagi ro'yxat bilan

var address = new List
() { new Address() { ZipCode = "123 cap 1567 AB 6666" },//1567 matches conds new Address() { ZipCode = "123 cap 4567 AB 6666" }, new Address() { ZipCode = "123 cap 4567 AB 1666" } };//1666 matches conds

linqEquivalent will contain the first and the third address.

1
qo'shib qo'ydi
LINQ Regex.Matchni qo'llab-quvvatlamaydi (va int.Parse ham).
qo'shib qo'ydi muallif user1531040, manba
Javobimga Linq ekvivalenti qo'shildi
qo'shib qo'ydi muallif user6996876, manba
Men manzil kodi ZipCode a'zo bo'lgan sinfning ro'yxatini nazarda tutgan deb hisoblayman.
qo'shib qo'ydi muallif user6996876, manba

Barcha javoblaringiz uchun rahmat. Men hammasini sinab ko'rdim.

Ehtimol, bu LINQ-to-SQL. Lekin hamma "All", "char.IsDigit" va "Regex.Match" funksiyalari ishlamayapti. SQL Server "jadval" versiyasi bo'ldi. Shuning uchun ZipcodeInt qo'shimcha maydon uchun ko'rinishni o'zgartirdim.

var address = address.Where(p => p.Zipcode != null
                                && p.Zipcode.Length > 4 
                                && p.ZipcodeInt > zipcodeFrom);
0
qo'shib qo'ydi
int intzipcode;

var address = address
    .Where(p => true
        && p.Zipcode != null
        && p.Zipcode.Length > 4
        && int.TryParse(p.Zipcode.Substring(0, 4), out intzipcode)
        && Convert.ToInt32(p.Zipcode.Substring(0, 4)) > 1000
        && Convert.ToInt32(p.Zipcode.Substring(0, 4)) < 2000
    )
0
qo'shib qo'ydi
EnsisNoctis kodini nusxa olasizmi?
qo'shib qo'ydi muallif Enigmativity, manba