Primo Chalice Ответов: 3

Как найти индекс значения в списке<igrouping<string, xelement>>?


У меня есть XML-файл, и он содержит несколько разделов. Многие из них могут повторяться, а могут и не повторяться. Я сгруппировал разделы и получил
List<IGrouping<string, XElement>>
переменная.

Теперь я хочу найти индекс строки в этом списке и распечатать его, но каждый раз, когда я запускаю цикл, он всегда равен 0.

Пожалуйста помочь.

С уважением
Аман

Что я уже пробовал:

//body contains the descendants of the main XML.    
List<IGrouping<string, XElement>> sectionlist = body.Descendants("sec").GroupBy(b => b.Element("title").Value).Select(b => b).ToList();

//Here, I want to find the index of uniquesections.Key in the list. "sectionlist"
             foreach (var uniquesections in sectionlist)
             {
                 string uniquesectionskey = uniquesections.Key;
                 var indesxofstring = sectionlist.FindIndex(el => sectionlist.ElementAt(sectionkey).Key == uniquesectionskey);
                 sectionkey++;
             }

3 Ответов

Рейтинг:
2

Graeme_Grant

Как указал OriginalGriff, немного трудно попытаться понять, чего вы пытаетесь достичь. Так что я попробую угадать...

Для этого ответа я собираюсь использовать пример, чтобы проиллюстрировать то, что я считаю, что вы пытаетесь достичь, используя фиктивные данные.

1. Мы создаем индекс для элементов, прежде чем они сгруппированы
2. Группа индексированный список
3. выполните поиск по группе и выровняйте ее до одного результата, удерживая ключ группы и индекс элемента.

class Program
{
    static void Main()
    {

        var actors = new List<Person>
        {
            new Person() {Name = "Gilligan", Sex = "male"},
            new Person() {Name = "The Skipper", Sex = "male"},
            new Person() {Name = "Thurston Howell, III ", Sex = "male"},
            new Person() {Name = "Mrs. Howell", Sex = "female"},
            new Person() {Name = "Ginger Grant", Sex = "female"},
            new Person() {Name = "Professor", Sex = "male"},
            new Person() {Name = "Mary Ann Summers ", Sex = "female"},
        };

        // search value
        var name1 = "Ginger Grant";

        // example 1 - flat list with index
        var indexedActors = actors.Select((x, i) => new {Index = i, Actor = x});

        // get the search result
        var result1 = indexedActors
            .FirstOrDefault(x => x.Actor.Name.Equals(name1));

        // get index of search value
        var index1 = result1?.Index ?? 0;

        // inxdex1 = 4


        // example 2 - grouped by sex list
        var groupedActors = indexedActors.GroupBy(x => x.Actor.Sex);

        var result2 = groupedActors
            .Select(x => new
            {
                key = x.Key,
                value = x.FirstOrDefault(y => y.Actor.Name.Equals(name1))
            })
            // only for valid group
            .Where(x => x.value != null);

        // get index & key of search value
        var index2 = result2?.Select(x => x.value.Index).FirstOrDefault() ?? 0;
        var key = result2?.Select(x => x.key).FirstOrDefault() ?? "";

        // inxdex2 = 4, key = "female"
    }
}

class Person
{
    public string Name { get; set; }
    public string Sex { get; set; }
}

Этот ответ предназначен для возврата только первого результата. Вам нужно будет внести изменения, если вам потребуется список результатов.


Maciej Los

5ed!

Рейтинг:
1

Richard Deeming

Ваш вопрос не имеет большого смысла. Вы перебираете список и хотите найти индекс текущего элемента в списке? Просто использовать for петля вместо а foreach петля:

for (int index = 0; index < sectionlist.Count; index++)
{
    IGrouping<string, XElement> section = sectionlist[index];
    Console.WriteLine("The index of '{0}' is {1}.", section.Key, index);
    ...
}

C# для оператора | Microsoft Docs[^]


Рейтинг:
0

OriginalGriff

Мы не можем сказать - это будет зависеть от ваших входных данных слишком много, и у нас нет никакого доступа к этому.
Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем этого сделать для вас - пришло время освоить новый (и очень, очень полезный) навык: отладку!