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();
}
}
}
List<>.IndexOf()
Имеется следующий код:
Код:
Что надо перегрузить с структуре? Возможно вопрос задан не совсем корректно. Просто до этого писал только на C++.
Заранее спасибо за помощь.
Цитата:
l.IndexOf(2)
В списке l содержатся экземпляры структуры s. Следовательно их индексы и можно определять. Например:
Код:
l.IndexOf(new s(4, 5))
Или например
Код:
l.IndexOf(new s(2, 2))
Код:
var x = new s(3,4);
Console.WriteLine(l.IndexOf(x));
Console.WriteLine(l.IndexOf(x));
UPD: синхронно ответили :)
Если я правильно понял, то данный метод производит поиск и возвращает мне индекс элемента списка, который содержит то, что я передал методу. в данном случае я хочу передать значение поля i и получить индекс соотвествующего элемента.
Цитата: Linar
Если я правильно понял, то данный метод производит поиск и возвращает мне индекс элемента списка, который содержит то, что я передал методу. в данном случае я хочу передать значение поля i и получить индекс соотвествующего элемента.
То, что вы хотите может быть реализовано с помощью метода расширения FindIndex и лямбда-выражения (C# 3.0):
Код:
Console.WriteLine(l.FindIndex(item => item.i == 2));
Код:
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();
}
}
}
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<> предполагает хранение любого типа, то и его методы должны легко перегружаться.
Код:
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);
}
}
}
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);
}
}
}
Есть ли в FCL, кроме структур, алгоритмы?
Цитата: Linar
Есть ли в FCL, кроме структур, алгоритмы?
Вы наверное хотели сказать BCL? В том виде как они есть в STL, насколько я знаю, нет. Часть из них реализована как методы коллекций, часть на уровне языка (например, foreach), часть не реализована по определенным соображениям, но может быть дописана пользовательскими расширениями.
Может быть не стоит искать параллели между C++ и C#, STL и BCL... а лучше попробовать возможности которые предоставляет C#?
Кстати, чем не устраивают уже два варианта, которые я предложил?
До этого я читал книгу по C# 1.0. Соответственно с лямбда-выражения не знаком. А использовать то, чего не понимаешь, не очень хочется. В итоге буду читать о 3-ей версии C# и использую Ваш первый вариант. Спасибо за помощь.