Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

List<>.IndexOf()

48K
15 августа 2009 года
Linar
6 / / 21.05.2009
Здравствуйте.
Имеется следующий код:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        struct s
        {
            public int i, j;
            public s(int i, int j)
            {
                this.i = i;
                this.j = j;
            }
        }
        static void Main(string[] args)
        {
            List<s> l = new List<s>();
            for (int i = 0; i < 10; i++)
                l.Add(new s(i+1,i+2));
            foreach (s ss in l)
                Console.WriteLine(ss.i+"-"+ss.j);
            Console.WriteLine(l.IndexOf(2)); //ошибка! Как реализовать работу данного метода под пользовательский тип?
            Console.ReadKey();
        }
    }
}


Что надо перегрузить с структуре? Возможно вопрос задан не совсем корректно. Просто до этого писал только на C++.

Заранее спасибо за помощь.
297
15 августа 2009 года
koodeer
1.2K / / 02.05.2009
Хм, индекс чего вы хотите получить ?
Цитата:
l.IndexOf(2)



В списке l содержатся экземпляры структуры s. Следовательно их индексы и можно определять. Например:

 
Код:
l.IndexOf(new s(4, 5))
даст индекс 3.
Или например
 
Код:
l.IndexOf(new s(2, 2))
что даст индекс -1, т. к. такого элемента нет в списке.
1.9K
15 августа 2009 года
GreenRiver
451 / / 20.07.2008
У вас список структур типа s и вы просите индекс числа 2 (типа int)... Логично ничего не скажешь :)
 
Код:
var x = new s(3,4);
Console.WriteLine(l.IndexOf(x));


UPD: синхронно ответили :)
48K
15 августа 2009 года
Linar
6 / / 21.05.2009
Если я правильно понял, то данный метод производит поиск и возвращает мне индекс элемента списка, который содержит то, что я передал методу. в данном случае я хочу передать значение поля i и получить индекс соотвествующего элемента.
1.9K
15 августа 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Linar
Если я правильно понял, то данный метод производит поиск и возвращает мне индекс элемента списка, который содержит то, что я передал методу. в данном случае я хочу передать значение поля i и получить индекс соотвествующего элемента.



То, что вы хотите может быть реализовано с помощью метода расширения FindIndex и лямбда-выражения (C# 3.0):

 
Код:
Console.WriteLine(l.FindIndex(item => item.i == 2));
48K
15 августа 2009 года
Linar
6 / / 21.05.2009
Я могу изменить способ сравнения, который использует данный метод, следующим образом:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        struct s: IEquatable<s>
        {
            public int i, j;
            public s(int i, int j)
            {
                this.i = i;
                this.j = j;
            }
            public bool Equals(s other)
            {
                return (i==((s)other).i);
            }
        }
        static void Main(string[] args)
        {
            List<s> l = new List<s>();
            for (int i = 0; i < 10; i++)
                l.Add(new s(i+1,i+2));
            foreach (s ss in l)
                Console.WriteLine(ss.i+"-"+ss.j);
            s st;
            st.i = 2; st.j = 2;
            Console.WriteLine(l.IndexOf(st));
            Console.ReadKey();
        }
    }
}


Есть ли возможность заставить сравнивать с int`ом?
Другими словами, я могу изменить поведения компаратора, но не могу заставить IndexOf принимать другие типы, кроме s. Можно ли заставить IndexOf принимать другой тип, кроме s?
В C++ алгоритму find я могу отправлять любой ключ, по которому будет произведен поиск. Главное, чтобы был перегружен оператор ==. А в C# не могу разобраться как добиться такого эффекта. Просто раз List<> предполагает хранение любого типа, то и его методы должны легко перегружаться.
1.9K
15 августа 2009 года
GreenRiver
451 / / 20.07.2008
В C# есть понятие метод-расширение - это способ расширить функциональность существующего класса. Нужно создать метод-расширение для класса List<>, а точнее конкретно для List<s>. Набросал на скорую руку:
Код:
using System;
using System.Collections.Generic;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List<s> l = new List<s>();
            for (int i = 0; i < 10; i++)
                l.Add(new s(i + 1, i + 2));
            foreach (s ss in l)
                Console.WriteLine(ss.i + "-" + ss.j);
            Console.WriteLine(l.IndexOf(2));
            Console.ReadKey();
        }
    }

    public struct s
    {
        public int i, j;
        public s(int i, int j)
        {
            this.i = i;
            this.j = j;
        }
    }

    public static class Extension
    {
        public static int IndexOf(this List<s> List, int i)
        {
            return List.FindIndex(item => item.i == i);
        }
    }
}
48K
15 августа 2009 года
Linar
6 / / 21.05.2009
Есть ли в FCL, кроме структур, алгоритмы?
1.9K
15 августа 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Linar
Есть ли в FCL, кроме структур, алгоритмы?



Вы наверное хотели сказать BCL? В том виде как они есть в STL, насколько я знаю, нет. Часть из них реализована как методы коллекций, часть на уровне языка (например, foreach), часть не реализована по определенным соображениям, но может быть дописана пользовательскими расширениями.
Может быть не стоит искать параллели между C++ и C#, STL и BCL... а лучше попробовать возможности которые предоставляет C#?

Кстати, чем не устраивают уже два варианта, которые я предложил?

48K
15 августа 2009 года
Linar
6 / / 21.05.2009
До этого я читал книгу по C# 1.0. Соответственно с лямбда-выражения не знаком. А использовать то, чего не понимаешь, не очень хочется. В итоге буду читать о 3-ей версии C# и использую Ваш первый вариант. Спасибо за помощь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог