C # - tamsaytlarning ro'yxatiga stringda aniq belgilar indekslarini qo'shish

longString ichida har bir oq bo'shliq va chiziqli belgilar indekslari ro'yxatini yaratish uchun quyidagi kodni qanday qilib olishimga oid ko'rsatma izlayapsiz.

Quyidagi ko'rsatmalarni bajarganimda, u faqatgina to'liq ro'yxatga 5 qo'shib qo'yadi. Quyida misol sifatida ishlatadigan mag'lubiyatni hisobga olib, men uni 5, 11, 14, 24 va 27 ni to'plashga harakat qilyapman.

static void Main(string[] args)
    {
        string longString = "hello world my user-name is stevieray8450";
        int longStringLength = longString.Length;
        char whiteSpace = ' ';
        char hyphen = '-';

       //list to store all indexes of white space
        List specialIndexes = new List();

        foreach (char c in longString)
        {
            if (c.Equals(whiteSpace) || c.Equals(hyphen))
            {
                specialIndexes.Add(longString.IndexOf(c));
            }
        }

foreach dagi mening c tagidagi c nima uchun har doim uchun kodi> specialIndexes.Add (longString.IndexOf (s)); ifodasi.

Har qanday fikr, fikr, sharhlar xush kelibsiz :) Rahmat!

0
IndexOf (s) birinchi bo'sh joyingizning indeksini (5) qaytarib olayotganiga o'xshaydi.
qo'shib qo'ydi muallif T James, manba

9 javoblar

Buning o'rniga for loopni indeksni bevosita olishingiz mumkin.

for(int i =0; i < longString.length; i++)
{
    if (longString[i].Equals(whiteSpace) || longString[i].Equals(hyphen))
    {
         specialIndexes.Add(i);
    }
}

Albatta, kimdir sizni kamroq kodda xuddi shu narsani qiladigan LINQ kodini oladi. Uni kuting ...

2
qo'shib qo'ydi
Yikes, nima uchun bu haqda o'ylamadim? Rahmat, do'stim!
qo'shib qo'ydi muallif Steve Boniface, manba

longString.IndexOf(c) when your c = ' ' will always evaluate to 5. IndexOf just returns the index of the first occurrence of its argument.

ommaviy int IndexOf (char qiymat)

     

Bu belgi topilgan qiymatning nol asoslangan indeks holati yoki yo'q bo'lsa -1.

Eslatib o'tamiz, char bir qiymat turi ekanligini unutmang, shuning uchun siz nusxa bilan ishlayapsiz.

1
qo'shib qo'ydi

Quyidagi satr ...

specialIndexes.Add(longString.IndexOf(c));

... birinchi v indeksini indeksini emas, joriy indeksni qaytaradi. Namuna satrida birinchi bo'shliq yoki chiziq 5-holatidagi bo'sh joy hisoblanadi.

Buni hal qilishning eng yaxshi yo'li loop uchun bo'ladi va hisoblagich qiymatini indeks sifatida saqlaydi.

0
qo'shib qo'ydi
static void Main(string[] args) {
    string longString = "hello world my user-name is stevieray8450";
    HashSet desiredChars = new HashSet { ' ', '-' };

    List specialIndexes = longString
       .Select((char, i) => new KeyValuePair(char, i))
       .Where(kvp => desiredChars.Contains(kvp.Key))
       .Select(kvp => kvp.Value)
       .ToList();
}
0
qo'shib qo'ydi

Men LINQ yechimlarini ulardan foydalanishim mumkin. LINQ bilan bog'liq muammo indekslarning keyingi bayonotga olib kelmasligi. Nimani nazarda tutishimni bilish uchun quyidagilarni ko'rib chiqing:

var longString = "hello world my user-name is stevieray8450";

var badIndices = longString
    .Where(c => c == ' ')
    .Select((c, i) => i)
    .ToArray();

Console.WriteLine($"[bad!] found ' ' at indices: {string.Join(", ", badIndices)}");

natijasi 5, 11, 14, 24, 27 bo'lishi kerak bo'lsa, haqiqiy natijalar quyidagicha bo'ladi:

[yomon!] topildi '' indekslar: 0, 1, 2, 3, 4

ko'chirish uchun to'g'ri indeksni olish uchun, biz tezda anonim qidiruv kodini yaratishimiz kerak:

    var indices = longString
        .Select((c, i) => new
        {
            idx = i,
            val = c
        })
        .Where(ci => ci.val == ' ')
        .Select(ci => ci.idx)
        .ToArray();

    Console.WriteLine($"[good] found ' ' at indices: {string.Join(", ", indices)}");

Agar siz unga yordam berilgandan keyin yomon bo'lmasangiz va men o'z looplarimni yozishni afzal ko'rsam. Natijalar quyidagilardir:

5, 11, 14, 24, 27

[yaxshi] topildi.

Ammo, bu holda, for-loop juda samarali va LINQ vaqtida taxminan 1/5 vaqt ichida yakunlanadi.

0
qo'shib qo'ydi

Kodingizning yana bir versiyasi:

string longString = "hello world my user-name is stevieray8450";
int longStringLength = longString.Length;
char whiteSpace = ' ';
char hyphen = '-';

// list to store all indexes of white space
List specialIndexes = new List();

int index = 0;
do
{
       index = longString.IndexOf(whiteSpace, index);
       if (index > -1)
       {
             specialIndexes.Add(index);
             index++;
       }

} while (index != -1);
0
qo'shib qo'ydi

bu javobdan >, IndexOf qisqacha hal qilish uchun:

var specialIndexes = new List();
for (int i = s.IndexOf(' '); i > -1; i = s.IndexOf(' ', i + 1))
{
    specialIndexes.Add(i);
}
0
qo'shib qo'ydi

Siz indeksni chaqirganingizda, siz dastlabki o'yindagi ko'rsatkichni topasiz

https://msdn.microsoft. com/en-us/library/k8b1470s (v = vs.110) .aspx

-ni tanlang

Siz bilan quyidagilarni sinashingiz mumkin:

string longString = "hello world my user-name is stevieray8450";
int longStringLength = longString.Length;
char whiteSpace = ' ';
char hyphen = '-';
int index = 0;

// list to store all indexes of white space
List specialIndexes = new List();

foreach (char c in longString)
{
    if (c.Equals(whiteSpace) || c.Equals(hyphen))
    {
        specialIndexes.Add(index);
    }
    index++;
}
0
qo'shib qo'ydi

Buning sababi, char turi qiymat turi va IndexOf faqat birinchi marta ro'yhatini qaytaradi. Buning natijasi o'laroq, 5 marta qaytariladi.

foreach ko'chadan yoki loopni uchun uchun o'z hisoblagichni kiritishingiz kerak va u erda indeksini ishlatishingiz kerak.

0
qo'shib qo'ydi