Che3ter
10 дек 2018 16:38
public class Circle { public double CenterX { get; set; } public double CenterY { get; set; } public double Radius { get; set; }
public Circle(double centerX, double centerY, double radius) { CenterX = centerX; CenterY = centerY; Radius = radius; }
public override bool Equals(object obj) { if (obj == null) return false; Circle c = obj as Circle; if (c as Circle == null) return false; return c.CenterX == this.CenterX && c.CenterY == this.CenterY && c.Radius == this.Radius; return c.GetHashCode() == this.GetHashCode(); }
public override int GetHashCode() { double tmp =(Math.Pow((double)CenterX,(double)2))+ (Math.Pow((double)CenterY, (double)2))+ (Math.Pow((double)Radius, (double)2))*1000; return (int)tmp; }
} class Program { static void Main(string[] args) { Circle c1 = new Circle(1, 1, 1); Circle c2 = new Circle(1.5, 1.5, 1.5); Circle c3 = new Circle(1, 5, 2); Circle c4 = new Circle(1, 1, 1); Console.WriteLine(c1.GetHashCode()); Console.WriteLine(c2.GetHashCode()); Console.WriteLine(c3.GetHashCode()); Console.WriteLine(c4.GetHashCode()); Console.WriteLine(c1.Equals(c2)); Console.WriteLine(c3.Equals(c1)); Console.WriteLine(c4.Equals(c1)); Console.ReadLine(); } }
|
dwebm@mail.ru
24 сен 2018 18:44
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApp17 { public class Circle { public int radius { get; set; } public int centerX { get; set; } public int centerY { get; set; }
public Circle(int radius, int centerX, int centerY) { this.radius = radius; this.centerX = centerX; this.centerY = centerY; }
public bool Equals(Circle obj) { if (obj == null) return false; //Circle c = obj as Circle; return this.radius == obj.radius && this.centerX == obj.centerX && this.centerY == obj.centerY; }
public override int GetHashCode() { int hashPoint; if (radius == 5) hashPoint = 1;
else hashPoint = 2;
return (radius*(centerX+centerY))+hashPoint; // некая абстрактная формула }
} class Program { static void Main(string[] args) { Circle c1 = new Circle(5, 10, 12); Circle c2 = new Circle(5, 10, 12); Circle c3 = new Circle(50, 100, 120);
Console.WriteLine(c1.Equals(c2)); Console.WriteLine(c1.Equals(c3));
Console.WriteLine("Hashes"); Console.WriteLine(c1.GetHashCode()); Console.WriteLine(c2.GetHashCode()); Console.WriteLine(c3.GetHashCode()); } } }
|
Lemon Party
19 июл 2018 22:30
class circle { public int center; public int radius; public circle(int center, int radius) { this.center = center; this.radius = radius; } public override bool Equals(object obj) {
circle x = (circle)obj; return x.center == this.center && x.radius == this.radius; } }
class Program { static void Main(string[] args) { circle circle1 = new circle(2,6); circle circle2 = new circle(3,4); circle circle3 = new circle(5,8); circle circle4 = new circle(2,4); circle circle5 = new circle(3,4); Console.WriteLine(circle1.Equals(circle2)); Console.WriteLine(circle1.Equals(circle3)); Console.WriteLine(circle1.Equals(circle4)); Console.WriteLine(circle1.Equals(circle5)); Console.WriteLine(circle2.Equals(circle5)); Console.ReadKey();
} }
|
мало ли кому
13 фев 2018 18:57
using System;
namespace ConsoleApp13 { class Program { static void Main(string[] args) { Circle sample = new Circle(2,3,4); Circle sample2 = new Circle(2, 3, 4); Circle sample3 = new Circle(5, 63, 48); Rect rect = new Rect(2, 3, 4, 5); Console.WriteLine(rect.Equals(sample)); Console.WriteLine(rect.Equals(sample2)); Console.WriteLine(rect.Equals(sample3)); Console.WriteLine(sample.Equals(sample3)); Console.WriteLine(sample.Equals(sample2)); Console.ReadLine(); } } class Circle { protected int centr_x; private int centr_y; private int radius; public int Centr_x { get { return centr_x; } set { centr_x = value; } } public int Centr_y { get { return centr_y; } set { centr_y = value; } } public int Radius { get { return radius; } set { radius = value; } }
public Circle(int a, int b, int c) { Centr_x = a; Centr_y = b; Radius = c; }
public override bool Equals(object obj) { Circle c = obj as Circle; if (obj == null) { return false; } else if (c as Circle == null) { return false; } else if (c.Centr_x == this.Centr_x && c.Centr_y == this.Centr_y && c.Radius == this.Radius) { return true; } else return false; }
public override int GetHashCode() { return base.GetHashCode(); } } class Rect : Circle { private int radius1; public int Radius1 { get { return radius1; } set { radius1 = value; } }
public Rect(int radius1, int a,int b, int c ): base(a,b,c) { Radius1 = radius1; }
public override bool Equals(object obj) { return base.Equals(obj); }
public override int GetHashCode() { return base.GetHashCode(); } } }
|
кто-кто
13 фев 2018 17:52
public override int GetHashCode() { int unitCode; if (Unit == "RUR") unitCode = 1; else unitCode = 2; return (int) Amount + unitCode; } Очень странная реализация хеша, я конечно понимаю что это для примера, но блин раз уже говорите о свойствах хеша...
|
Nekto
28 янв 2018 17:41
|
Nekto
28 янв 2018 17:40
protected int axisX; protected int axisY; protected int r; public Circle(int axisX, int axisY, int r) { this.axisX = axisX; this.axisY = axisY; this.r = r; } public bool Equals(Circle circle) { if (circle.r == 0 || r == 0) return false; return circle.axisX == axisX && circle.axisY == axisY && circle.r == r; } public override int GetHashCode() { return r + axisX - axisY; } } class Program { static void Main(string[] args) { Circle c1 = new Circle(5, 3, 3); Circle c2 = new Circle(5, 3, 3); Circle c3 = c1; Circle c4 = new Circle(7, 0, 0); Console.WriteLine("{0}, {1}, {2}", c1.Equals(c2), c2.Equals(c3), c1.Equals(c4)); Console.WriteLine("{0}, {1}", c1.GetHashCode() == c2.GetHashCode(), c3.GetHashCode() == c4.GetHashCode()); Console.ReadKey(); } }
|
Alexey
19 дек 2017 00:23
лучше было бы сделать CoordinateX и CoordinateY, но мне просто хотелось сделать поле-массив...
public class Circle { public double[] Coordinats {get; set;} public double Radius {get; set;} public Circle (double X, double Y, double R){ Coordinats = new Double[]{X, Y}; Radius = R; } public override bool Equals(object obj){ if (obj == null) return false; Circle C = obj as Circle; if (C as Circle == null) return false; return C.Coordinats[0] == this.Coordinats[0] && C.Coordinats[1] == this.Coordinats[1] && C.Radius == this.Radius; } public bool Equals(Circle obj){ if (obj == null) return false; return obj.Coordinats[0] == this.Coordinats[0] && obj.Coordinats[1] == this.Coordinats[1] && obj.Radius == this.Radius; } public override int GetHashCode(){ return Convert.ToInt32( this.Coordinats[0] + this.Coordinats[1] + this.Radius); } }
|
Кирюха
13 дек 2017 13:11
namespace Peregryzka_Equals_Get { public class karta { public int X; public int Y; public int R; public karta (int X, int Y) { this.X= X; this.Y=Y; } public override bool Equals (Object Obj) { if (Obj == null) return false; karta m = Obj as karta; if (m== null) return false; return (this.R==m.R && this.R==m.R && this.X==m.X && this.Y==m.Y); } public bool Equals (karta Obj) { if (Obj == null) return false; return (this.R==Obj.R && this.R==Obj.R &&this.X==Obj.X && this.Y==Obj.Y ); } public override int GetHashCode () { return (X*1000+Y*100+R); } } public class Programm { public static void Main (string[] args) { Random r =new Random(); int[,] pole = new int[3, 3]{{r.Next() % 10, r.Next() % 10,r.Next() % 10}, // инициализация массива(пространство с координатами) случайными значениями радиусов {r.Next() % 10, r.Next() % 10,r.Next() % 10}, {r.Next() % 10, r.Next() % 10,r.Next() % 10}}; karta Kryg1= new karta(1,1); karta Kryg2= new karta(1,1); karta Kryg3= new karta(2,1); karta Kryg4= new karta(0,2); Kryg1.R= pole[Kryg1.X, Kryg1.Y]; Kryg2.R= pole[Kryg2.X, Kryg2.Y]; Kryg3.R= pole[Kryg3.X, Kryg3.Y]; Kryg4.R= pole[Kryg4.X, Kryg4.Y]; Console.WriteLine(Kryg1.Equals(Kryg2));//true Console.WriteLine(Kryg3.Equals(Kryg1));//false Console.WriteLine(Kryg4.Equals(Kryg3));//false Console.WriteLine("Радиус 1-й окружности"+Kryg1.R); Console.WriteLine("Радиус 2-й окружности"+Kryg2.R); Console.WriteLine("Радиус 3-й окружности"+Kryg3.R); Console.WriteLine("Радиус 4-й окружности"+Kryg4.R); Console.WriteLine(Kryg1.GetHashCode()); Console.WriteLine(Kryg2.GetHashCode()); Console.WriteLine(Kryg3.GetHashCode()); Console.WriteLine(Kryg4.GetHashCode()); } }
}
|
Сергей
02 дек 2017 12:58
За основу взял программу про воина и ( из урока наследование класса) воина в броне. Создал воинов с одинаковыми именами и HP, но из разных классов. Сравнил имена и HP воина без брони и воина в броне. Затем нанес им равный урон и снова сравнил.
using System;
namespace ConsoleApp1 { class warrior { string Name; int Health, maxHealth = 1000, minHealth = 100;
public warrior(string Name, int Health) { this.Name = Name; this.Health = Health; if (Health < minHealth) Health = minHealth; if (Health > maxHealth) Health = maxHealth; } public virtual void getDamage(int damage) { Health -= damage; if (Health < 0) { Health = 0; Console.WriteLine("боец " + Name + " погиб в бою"); } else Console.WriteLine("У бойца " + Name + " осталось " + Health + "HP"); }
public override bool Equals(object obj) { if (obj == null) return false; warrior m = obj as warrior; // возвращает null если объект нельзя привести к типу warrior if (m as warrior == null) return false;
return m.Name == this.Name && m.Health == this.Health; }
} class ArmoredWarrior : warrior { public double armor; public ArmoredWarrior(string Name, int Health, double armor) : base(Name, Health) { this.armor = armor; } public override void getDamage(int damage) { damage = Convert.ToInt32(damage * (1 - armor)); base.getDamage(damage); }
} class Program { static void Main(string[] args) { warrior w1 = new warrior("Вася", 200); ArmoredWarrior w2 = new ArmoredWarrior("Вася", 200, 0.8); if (w1.Equals(w2)) Console.WriteLine("Бойцы имеют одинаковые имена и HP"); else Console.WriteLine("Бойцы отличаются по имени или HP или их нельзя сравнить"); w1.getDamage(20); w2.getDamage(20); if (w1.Equals(w2)) Console.WriteLine("Бойцы имеют одинаковые имена и HP"); else Console.WriteLine("Бойцы отличаются по имени или HP или их нельзя сравнить"); Console.ReadLine(); } } }
|
dsfdsfsf
19 июл 2017 09:33
public class Program { class Circle { private double[] centr = new double[2]; private double radius { get; set; }
public Circle(double CentrCircleX,double CentrCircleY,double Radius) { centr[0] = CentrCircleX; centr[1] = CentrCircleY; radius = Radius; } public bool Equals(Circle obj) { if (obj == null) return false; return obj.radius == this.radius && obj.centr[0] == this.centr[0] && obj.centr[1] == this.centr[1]; } public override int GetHashCode() { return (int)(radius + centr[0] + centr[1]) + 100; } } public static void Main() { Circle c1 = new Circle(3.2, 2.2, 1.7); Circle c2 = c1; Circle c3 = new Circle(3.2, 2.2, 1.7); Circle c4 = new Circle(4.4, 5, 4.4); Console.WriteLine(c4.GetHashCode()); Console.WriteLine(c1.GetHashCode()); } }
|
Максим
04 июл 2017 21:30
NikolayS --- Текущий объект это тот, что через this, тот, чей метод вызывается. А "m" это другой объект, переданный в метод текущему объекту
|
NikolayS
03 июл 2017 23:48
Здравствуйте, могли бы вы описать что происходит в этой строке.
return m.Amount == this.Amount && m.Unit == this.Unit; Как я понял m.Amount поле в которое запишется переданный параметр obj в метод Equals и сравнивается он с полем Amount текущего объекта, но разве поле m.Amount не является тем самым текущим объектом?
|
Stavr
23 ноя 2016 07:51
ИМХО лучшее реализация "GetHashCode" приридумал SDenV 25 фев 2015 13:05. Плюсовать к друг дружке переменные не очень хорошая идея. Если их местами поменять тот же код получится :-/
public override int GetHashCode() { string s =string.Format("{0}{1}{2}", radius, centreX, centreY); return Convert.ToInt32(s); }
|
ProfessorWho
10 сен 2016 09:22
class Circle { public double radious { get; set; } public int[] crdn = new int[2]; public Circle(double Rad,int CoordinateX,int CoordinateY) { crdn[0] = CoordinateX; crdn[1] = CoordinateY; radious = Rad; } public bool Equals(Circle obj) { if (obj == null) return false; return obj.radious == this.radious && obj.crdn[0] == this.crdn[0] && obj.crdn[1] == this.crdn[1]; } public override int GetHashCode() { return (int)((radious / crdn[0]) * crdn[1]); } } class Program { static void Main(string[] args) { Circle krug1 = new Circle(30, 32, 31); Circle krug2 = new Circle(30, 32, 31); Circle krug3 = new Circle(56, 1, 9); Console.WriteLine(krug1.GetHashCode()); Console.WriteLine(krug2.GetHashCode()); Console.WriteLine(krug1.Equals(krug2)); Console.WriteLine(krug1.Equals(krug3)); Console.WriteLine(krug3.GetHashCode()); Console.ReadKey(); } }
|
bas-tion.ru
09 май 2016 12:57
class Program { // Создайте класс окружность с полями координаты центра и радиус // и переопределите в нем корректно методы Equals и GetHashCode. // Окружности равны если у них одинаковые координаты центра и радиусы.
class Circle { // Объявляем поля класса, целочисленные, доступ к полям только внутри класса private int CenterX; private int CenterY; private int Radius;
// Создаём конструктор для присвоения значений полям при инициализации public Circle(int aCenterX , int aCenterY, int aRadius) { CenterX = aCenterX; CenterY = aCenterY; Radius = aRadius; }
// Создаём метод с именем Equals, в качестве аргумента (Circle anObj) - объект // класса Circle. Метод будет сравнивать поля текущего объекта (this) // и указанного в качестве аргумента (anObj) используя "==". Возвращается bool public bool Equals(Circle anObj) { if (anObj == null) return false; return anObj.CenterX == this.CenterX && anObj.CenterY == this.CenterY && anObj.Radius == this.Radius; }
// Перегружаем GetHashCode - наследуется от класса Object // После перегрузки будет возвращать сумму всех полей. public override int GetHashCode() { return (int)CenterX + CenterY + Radius; } } static void Main(string[] args) { // Создаём две окружности Circle myCricle1 = new Circle(10, 10, 4); Circle myCricle2 = new Circle(10, 10, 4);
// Выводим Hash Console.WriteLine(myCricle1.GetHashCode()); Console.WriteLine(myCricle2.GetHashCode());
// Проверяем, равны ли они и выводим в консоль Console.WriteLine(myCricle1.Equals(myCricle2));
// Console.ReadKey(); } }
|
игорь
02 фев 2016 10:54
namespace ConsoleApplication70 { class Circle { internal int centr_x; internal int centr_y; internal int Radius;
public Circle(int x, int y, int R) { centr_x = x; centr_y = y; Radius = R; }
public override bool Equals(object obj) { if (obj == null) return false; Circle c = obj as Circle; if (c == null) return false; return c.centr_x == this.centr_x && c.centr_y == this.centr_y && c.Radius == this.Radius;
} public override int GetHashCode() {
return centr_x + centr_y + Radius; }
} class Program { static void Main(string[] args) { Circle one = new Circle(10, 10, 10); Circle two = new Circle(10, 10, 10); Circle three = new Circle(11, 10, 10); Console.WriteLine(one.Equals(two)); Console.WriteLine(one.Equals(three)); Console.WriteLine(one.GetHashCode()); Console.WriteLine(three.GetHashCode()); } } }
|
Nick
25 янв 2016 10:01
почему бы в проверке Money m = obj as Money; if (m as Money == null) return false; не писать сразу так: Money m = obj as Money; if (m == null) return false; ?
|
Евгений
10 янв 2016 17:51
public static void Main(string[] args) { Circle pCirc1 = new Circle(10,10,5); Circle pCirc2 = new Circle(10,5,10); Circle pCirc3 = new Circle(10,1,5); Circle pCirc4 = new Circle(10,10,5); Console.WriteLine("Equals"); Console.WriteLine("pCirc1.Equals(pCirc2) : " + pCirc1.Equals(pCirc2)); Console.WriteLine("pCirc1.Equals(pCirc3) : " + pCirc1.Equals(pCirc3)); Console.WriteLine("pCirc1.Equals(pCirc4) : " + pCirc1.Equals(pCirc4)); Console.WriteLine("pCirc2.Equals(pCirc3) : " + pCirc2.Equals(pCirc3)); Console.WriteLine("pCirc2.Equals(pCirc4) : " + pCirc2.Equals(pCirc4)); Console.WriteLine("pCirc3.Equals(pCirc4) : " + pCirc3.Equals(pCirc4)); Console.WriteLine("\r\n\r\nHash"); Console.WriteLine("pCirc1.GetHashCode() : " + pCirc1.GetHashCode()); Console.WriteLine("pCirc2.GetHashCode() : " + pCirc2.GetHashCode()); Console.WriteLine("pCirc3.GetHashCode() : " + pCirc3.GetHashCode()); Console.WriteLine("pCirc4.GetHashCode() : " + pCirc4.GetHashCode()); Console.ReadKey(); }
public class Circle { public double nX{set;get;} public double nY{set;get;} public double nR{set;get;} public Circle() { } public Circle(int x, int y, int r) { this.nX = x; this.nY = y; this.nR = r; } public bool Equals(Circle pCirc) { if(this.nX == pCirc.nX && this.nY == pCirc.nY && this.nR == pCirc.nR) { return true; } return false; } public override int GetHashCode() { return (int)(this.nX*this.nY*this.nR); } }
|
Kolsky
03 янв 2016 15:30
/* * Created by SharpDevelop. * User: Kolsky * Date: XX.XX.XXXX * Time: XX:YY * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System;
namespace a { class Circle { public Circle(){} public Circle(int r, double x, double y) { this.Centre_X=x; this.Centre_Y=y; this.Radius=r; } public double Radius; public double Centre_X; public double Centre_Y; public Boolean Equals(Circle a) { if(a==null) return false; return a.Centre_X==this.Centre_X && a.Centre_Y == this.Centre_Y && a.Radius == this.Radius; } public override bool Equals(object obj) { if (obj==null) return false; Circle a=obj as Circle; return a.Centre_X==this.Centre_X && a.Centre_Y == this.Centre_Y && a.Radius == this.Radius; } public override int GetHashCode() { return Convert.ToInt32(Radius+Centre_X+Centre_Y); } } class Program { public static void Main(string[] args) { Circle C1=new Circle(5,0,0); Circle C2=new Circle(5,0,0); Circle C3=new Circle(); Circle C4=new Circle(4,8,5); Console.Write((C1.Equals(C2)?"1 ":"0 ")+(C1.Equals(C3)?"1\r\n":"0\r\n")); Console.Write(C4.GetHashCode()+", "+C1.GetHashCode()); Console.ReadKey(true); } } }
|
Kolsky
03 янв 2016 15:30
/* * Created by SharpDevelop. * User: Kolsky * Date: XX.XX.XXXX * Time: XX:YY * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System;
namespace a { class Circle { public Circle(){} public Circle(int r, double x, double y) { this.Centre_X=x; this.Centre_Y=y; this.Radius=r; } public double Radius; public double Centre_X; public double Centre_Y; public Boolean Equals(Circle a) { if(a==null) return false; return a.Centre_X==this.Centre_X && a.Centre_Y == this.Centre_Y && a.Radius == this.Radius; } public override bool Equals(object obj) { if (obj==null) return false; Circle a=obj as Circle; return a.Centre_X==this.Centre_X && a.Centre_Y == this.Centre_Y && a.Radius == this.Radius; } public override int GetHashCode() { return Convert.ToInt32(Radius+Centre_X+Centre_Y); } } class Program { public static void Main(string[] args) { Circle C1=new Circle(5,0,0); Circle C2=new Circle(5,0,0); Circle C3=new Circle(); Circle C4=new Circle(4,8,5); Console.Write((C1.Equals(C2)?"1 ":"0 ")+(C1.Equals(C3)?"1\r\n":"0\r\n")); Console.Write(C4.GetHashCode()+", "+C1.GetHashCode()); Console.ReadKey(true); } } }
|
ROOT
30 авг 2015 15:51
//Домашнее задание//
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApplication1 { class Circle { public double Center_x { get; set; } public double Center_y { get; set; } public double Radius { get; set; } public Circle(double x, double y, double rad) { Center_x = x; Center_y = y; Radius = rad; } public override bool Equals(object obj) { if (obj == null) return false; Circle c = obj as Circle; if (c as Circle == null) return false; return c.Center_x == this.Center_x && c.Center_y == this.Center_y && c.Radius == this.Radius; } public bool Equals(Circle obj) { if (obj == null) return false; return obj.Center_x == this.Center_x && obj.Center_y == this.Center_y && obj.Radius == this.Radius; } public override int GetHashCode() { return (int)Center_x + (int)Center_y + (int)Radius; } } class Program { static void Main(string[] args) { Circle cr1 = new Circle(12, 14, 20); Circle cr2 = new Circle(21, 32, 56); Circle cr3 = new Circle(12, 14, 20); Circle cr4 = new Circle(48, 59, 70); Console.WriteLine("Сравнение:1-ой и 2-ой окружности: " + cr1.Equals(cr2)); Console.WriteLine("Сравнение:2-ой и 3-ей окружности: " + cr2.Equals(cr3)); Console.WriteLine("Сравнение:1-ой и 3-ей окружности: " + cr1.Equals(cr3)); Console.WriteLine("Сравнение:2-ой и 4-ой окружности: " + cr2.Equals(cr4)); Console.WriteLine("\nХеш-код 1-ой окружности: " + cr1.GetHashCode()); Console.WriteLine("Хеш-код 2-ой окружности: " + cr2.GetHashCode()); Console.WriteLine("Хеш-код 3-ей окружности: " + cr3.GetHashCode()); Console.WriteLine("Хеш-код 4-ой окружности: " + cr4.GetHashCode()); Console.ReadKey(); } } }
|
Александр_Бугай
18 май 2015 19:57
class Circle { public double Center{get;set;} public double Radius { get; set; } public Circle(double center, double radius) { Center = center; Radius = radius; } public override bool Equals(object obj) { if (obj == null) return false; Circle c = obj as Circle; if (c as Circle == null) return false; return c.Center == this.Center && c.Radius == this.Radius; } public override int GetHashCode() { return (int)Radius + (int)Center; }
} class Program { static void Main(string[] args) { Console.WriteLine("Input center of the first circle"); double cir1 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Input radius of the first circle"); double rad1 = Convert.ToDouble(Console.ReadLine()); Circle c1 = new Circle(cir1, rad1); Console.WriteLine("Input center of the second circle"); double cir2 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Input radius of the second circle"); double rad2 = Convert.ToDouble(Console.ReadLine()); Circle c2 = new Circle(cir2, rad2); if (c1.Equals(c2) == true && c1.GetHashCode() == c2.GetHashCode()) { Console.WriteLine(c1.GetHashCode()); Console.WriteLine("They are equality"); } else { Console.WriteLine("They are different"); Console.WriteLine("Equals - " + c1.Equals(c2)); Console.WriteLine("Hash1 = " + c1.GetHashCode()); Console.WriteLine("Has2 = " + c1.GetHashCode()); } Console.ReadLine(); } }
|
Азиз
18 май 2015 19:27
Максим --- Да, проглупил насчет условия :) А насчет центра - я образно, принцип от этого не меняется
|
Максим
17 май 2015 18:37
Азиз --- В методе GetHashCode не нужно никаких условий, здесь достаточно было бы вернуть сумму радиуса и центра (центр у вас непонятный, предпологалась точка x,y).
|
Азиз
17 май 2015 14:45
Вот, пожалуйста проверьте.
class Program { public static void Main(string[] args) { Circle c1 = new Circle(40,100); Circle c2 = new Circle(50,100); Circle c3 = new Circle(40,100); Console.WriteLine(c1.Equals(c2)); // false Console.WriteLine(c1.Equals(c3)); // true Console.WriteLine(c1.GetHashCode()); //100 Console.ReadLine(); } } class Circle { public int Center; public int Radius; public Circle(int center, int radius) { this.Center = center; this.Radius = radius; } public override bool Equals(object obj) { if (obj is Circle) { return ((obj as Circle).Center == this.Center && (obj as Circle).Radius == this.Radius); } else { return false; } } public override int GetHashCode() { if (this.Center == 40 && this.Radius == 100) { return 100; } else{ return 0; } } }
|
SDenV
25 фев 2015 13:05
Вроде бы, правильно сделал. Спасибо за уроки
class Program
{
static void Main(string[] args)
{
Circle c = new Circle(2, 5, 5);
Circle c1 = new Circle(5, 6, 6);
Circle c2 = new Circle(5, 6, 6);
Console.WriteLine((c1.Equals(c2)) ? c1.GetHashCode() : c.GetHashCode());
Console.WriteLine((c.Equals(c1)) ? c1.GetHashCode() : c.GetHashCode());
}
}
class Circle
{
int radius { get; set; }
int centreX { get; set; }
int centreY { get; set; }
public Circle(int radius, int centreX, int centreY)
{
this.radius = radius;
this.centreX = centreX;
this.centreY = centreY;
}
public override int GetHashCode()
{
string s =string.Format("{0}{1}{2}", radius, centreX, centreY);
return Convert.ToInt32(s);
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
Circle c = obj as Circle;
if (c as Circle == null)
return false;
return c.centreX == this.centreX && c.centreY == this.centreY && c.radius == this.radius;
}
public bool Equals(Circle obj)
{
if (obj == null)
return false;
return obj.radius == this.radius && obj.centreX == this.centreX && obj.centreY == this.centreY;
}
}
|
AlexWolf
25 фев 2015 09:14
namespace ConsoleApplication1 { class Okruzhnost { public int CentrcoordX { get; set; } public int CentrcoordY { get; set; } public int Diametr { get; set; } public Okruzhnost(int centrcoordX, int centrcoordY, int diametr) { CentrcoordX = centrcoordX; CentrcoordY = centrcoordY; Diametr = diametr; } public override bool Equals(object obj) { if (obj == null) { return false; } Okruzhnost a = obj as Okruzhnost; if (a as Okruzhnost == null) { return false; } return a.CentrcoordX == this.CentrcoordX && a.CentrcoordY == this.CentrcoordY && a.Diametr == this.Diametr; } public bool Equals(Okruzhnost obj) { if (obj == null) { return false; } return obj.CentrcoordX == this.CentrcoordX && obj.CentrcoordY == this.CentrcoordY && obj.Diametr == this.Diametr; } public override int GetHashCode() { int code = 1; if (Diametr == 65 && CentrcoordX == 150 && CentrcoordY == 150) { code = 1; } else { code = (CentrcoordX+CentrcoordY)*1000+Diametr; } return (int)code; } } class Program { static void Main(string[] args) { Okruzhnost ring1 = new Okruzhnost(150, 150, 65); Okruzhnost ring2 = new Okruzhnost(150, 100, 65); Okruzhnost ring3 = new Okruzhnost(150, 150, 65); Okruzhnost ring4 = ring1; Okruzhnost ring5 = new Okruzhnost(110, 170, 85); Console.WriteLine(ring1.GetHashCode()); Console.WriteLine(ring2.GetHashCode()); Console.WriteLine(ring3.GetHashCode()); Console.WriteLine(ring4.GetHashCode()); Console.WriteLine(ring5.GetHashCode()); Console.WriteLine("равны ли 1 и 2 круг? "+ring1.Equals(ring2)); Console.WriteLine("равны ли 1 и 3 круг? " + ring1.Equals(ring3)); Console.WriteLine("равны ли 1 и 4 круг? " + ring1.Equals(ring4)); Console.WriteLine("равны ли 1 и 5 круг? " + ring1.Equals(ring5)); Console.ReadKey(); } } }
|
Максим
21 фев 2015 14:46
Виталий --- У вас получилась очень громоздкая перегрузка метода GetHashCode, можно ведь проще. Урок "Работа со строками" читали? Вот как я заменил в вашей программе этот метод:
public override int GetHashCode() { string[] koordinats = centrekoordinats.Split(':'); return radius + Convert.ToInt32(centrekoordinats[0]) + Convert.ToInt32(centrekoordinats[1]); }
|
Виталий
21 фев 2015 12:54
Оперативно исправил:
class circle { public int radius; public string centrekoordinats; public override bool Equals(object obj) { if (obj == null) return false; circle m = obj as circle; if (m as circle == null) return false; return m.radius == this.radius && m.centrekoordinats == this.centrekoordinats; } public bool Equals(circle obj) { if (obj == null) return false; return obj.radius == this.radius && obj.centrekoordinats == this.centrekoordinats; } public override int GetHashCode() { int unitCode; int unitcode; switch (radius) { case 10: unitCode = 10; break; case 11: unitCode = 11; break; case 12: unitCode = 12; break; case 13: unitCode = 13; break; case 14: unitCode = 14; break; case 15: unitCode = 15; break; case 16: unitCode = 16; break; case 17: unitCode = 17; break; case 18: unitCode = 18; break; case 19: unitCode = 19; break; case 20: unitCode = 20; break; default: unitCode = 212; break; } switch (centrekoordinats) { case "10:10": unitcode = 20; break; case "11:11": unitcode = 22; break; case "12:12": unitcode = 24; break; case "13:13": unitcode = 26; break; case "14:14": unitcode = 28; break; case "15:15": unitcode = 30; break; case "16:16": unitcode = 32; break; case "17:17": unitcode = 34; break; case "18:18": unitcode = 36; break; case "19:19": unitcode = 38; break; case "20:20": unitcode = 40; break; default: unitcode = 212; break; } return (int)unitcode + unitCode; }
public circle(int radius, string centrekoordinats) { this.radius = radius; this.centrekoordinats = centrekoordinats; }
} class Program { static void Main(string[] args) { circle circle1 = new circle(15, "10:10"); circle circle2 = new circle(15, "10:10"); circle circle3 = new circle(21, "21:21"); circle circle4 = new circle(18, "12:12"); Console.WriteLine(circle1.GetHashCode()); Console.WriteLine(circle2.GetHashCode()); Console.WriteLine(circle3.GetHashCode()); Console.WriteLine(circle4.GetHashCode()); Console.ReadKey();
} }
|
Максим
20 фев 2015 20:53
Виталий --- Конструктор пустой, поля не инициализирует:
public circle(int radius, string centrekoordinats) { this.radius = radius; this.centrekoordinats = centrekoordinats; }
Ну и не нужно создавать поле HashCode, это значение должен возвращать метод GetHashCode:
Console.WriteLine(circle1.GetHashCode());
|
Виталий
20 фев 2015 18:28
Подскажите пожалуйста, почему выдает 0? Пытался переписать return. Но все равно не работает.
class circle { public int radius; public string centrekoordinats; public override bool Equals(object obj) { if (obj == null) return false; circle m = obj as circle; if (m as circle == null) return false; return m.radius == this.radius && m.centrekoordinats == this.centrekoordinats; } public bool Equals(circle obj) { if (obj == null) return false; return obj.radius == this.radius && obj.centrekoordinats == this.centrekoordinats; } public int HashCode; public int unitcode; public int unitCode;
public override int GetHashCode() { if (centrekoordinats == "1:1") unitCode = 11; if (centrekoordinats == "2:2") unitCode = 22; if (centrekoordinats == "3:3") unitCode = 33; if (centrekoordinats == "4:4") unitCode = 44; if (centrekoordinats == "5:5") unitCode = 55; if (centrekoordinats == "6:6") unitCode = 66; if (centrekoordinats == "7:7") unitCode = 77; if (centrekoordinats == "8:8") unitCode = 88; if (centrekoordinats == "9:9") unitCode = 99; else unitCode = 212; if (radius == 11) unitcode = 11; if (radius == 12) unitcode = 12; if (radius == 13) unitcode = 13; if (radius == 14) unitcode = 14; if (radius == 15) unitcode = 15; if (radius == 16) unitcode = 16; if (radius == 17) unitcode = 17; if (radius == 18) unitcode = 18; if (radius == 19) unitcode = 19; else unitcode = 212; return HashCode = unitCode + unitcode; } public circle(int radius, string centrekoordinats) { } } class Program { static void Main(string[] args) { circle circle1 = new circle(15, "9:9"); circle circle2 = new circle(15, "6:6"); circle circle3 = new circle(15, "9:9"); circle circle4 = new circle(21, "12:12"); Console.WriteLine(circle1.HashCode); Console.WriteLine(circle2.HashCode); Console.WriteLine(circle3.HashCode); Console.WriteLine(circle4.HashCode); Console.ReadKey(); } }
|
Диманиак
02 дек 2014 11:40
namespace ConsoleApplicationTest { public class Circle { int CenterX; int CenterY; int Radius; public Circle(int centerX, int centerY, int radius) { CenterX = centerX; CenterY = centerY; Radius = radius; } public override bool Equals(object obj) { if (obj == null) return false; Circle c = obj as Circle; if (c as Circle == null) return false; return c.CenterX == CenterX && c.CenterY == CenterY && c.Radius == Radius; } public bool Equals(Circle obj) { if (obj == null) return false; return obj.CenterX == CenterX && obj.CenterY == CenterY && obj.Radius == Radius; } public override int GetHashCode() { string vector = "("+CenterX.ToString() + "," + CenterY.ToString() + "," + Radius.ToString()+")"; return vector.GetHashCode(); } } class Program { static void Main(string[] args) { List<Circle> circles = new List<Circle>(); Circle circle1 = new Circle(111, 1, 111); circles.Add(circle1); circles.Add(new Circle(11, 11, 111)); circles.Add(new Circle(1, 1111, 11)); circles.Add(new Circle(111, 1, 111)); Circle circle2 = circle1; circles.Add(circle2); for (int i = 0; i < circles.Count; i++) for (int j = i+1; j < circles.Count; j++) { Console.WriteLine("Ref to Circle № " + (i + 1) + " " + (circles.ElementAt(i) == circles.ElementAt(j) ? "==" : "!=") + " Ref to Circle № " + (j + 1)); Console.WriteLine("Circle № " + (i + 1) + " " + (circles.ElementAt(i).Equals(circles.ElementAt(j)) ? "equals" : "not equals") + " Circle № " + (j + 1)); Console.WriteLine("HashCode of Circle № " + (i + 1) + " " + (circles.ElementAt(i).GetHashCode() == circles.ElementAt(j).GetHashCode() ? "==" : "!=") + " HashCode of Circle № " + (j + 1)); Console.WriteLine(""); Console.ReadLine(); } } } }
|
Max
12 ноя 2014 10:28
Ясно, спасибо за ответ. То есть хеш там в принципе реализован, но майкрософт просто снимают с себя ответственность за его надежность и не указывают конкретный алгоритм.
|
Максим
11 ноя 2014 19:14
Max --- Если не переопределять метод GetHashCode, он будет вычислять хеш алгоритмом по умолчанию, который не специфицирован (но не рандом). MSDN пишет:
"Реализация GetHashCode по умолчанию не гарантирует уникальные значения для различных объектов. Кроме того, .NET Framework не гарантирует, что реализация GetHashCode по умолчанию, в том числе значения, возвращаемые ей, не поменяются при смене версии фреймворка. Соответственно, значение функции GetHashCode по умолчанию не должно быть использована как уникальный идентификатор объекта с целью хеширования."
Когда же мы переопределяем этот метод, наш алгоритм хеширования может быть очень простым - одно поле объекта умноженное на другое и т. д.
|
Max
10 ноя 2014 20:14
Хотя реализация вычисления хеша в уроке говорит о том, что в данном случае под хеш-кодом подразумевается вовсе не тот хеш, который подразумевается всегда. Я подумал, что метод вычисляет хеш от входных данных по какому-то существующему алгоритму, но в данном случае это просто случайное число, так?
|
Max
10 ноя 2014 20:03
Поправьте статью: "Только это не означает, что если объекты неравны, то их хеш-коды обязательно будут разными." Хеши разных объектов (пусть даже отличных всего на 1 бит) ВСЕГДА будут отличаться очень сильно. Это главное требование к хешам с точки зрения криптографии. Исключения называются коллизиями, но их наличие считается несовершенством алгоритма хеширования (любого), а не нормой. И встречаются коллизии очень редко, для ориентира можно считать 1/(10^20), то есть сугубо теоретически.
|
why_not
08 ноя 2014 13:33
Оставил ошибку(когда centr = 1000*radius), т. к. не знаю, что такое хеш-таблицы и как они работают. В остальном, все сделал по примеру, но осознанно))
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { public class Circle { public int Centr { get; set; } public int Radius { get; set; } public Circle(int Centr, int Radius) { this.Centr = Centr; this.Radius = Radius; } public override bool Equals(object obj) { if (obj == null) return false; Circle c = obj as Circle; if (c as Circle == null) return false; return c.Centr == this.Centr && c.Radius == this.Radius; } public bool Equals(Circle obj) { if (obj == null) return false; return obj.Centr == this.Centr && obj.Radius == this.Radius; }
public override int GetHashCode() { return (int) Centr * 1000 + Radius; }
} class Program { static void Main(string[] args) { Circle c1 = new Circle(50, 100); Circle c2 = new Circle(50, 100); Circle c3 = new Circle(60, 30); Circle c4 = c1; Console.WriteLine(c1.Equals(c2)); Console.WriteLine(c1.Equals(c3)); Console.WriteLine(c1 == c2); Console.WriteLine(c1 == c4); Console.WriteLine(c1.GetHashCode()); Console.WriteLine(c2.GetHashCode()); Console.WriteLine(c3.GetHashCode()); Console.ReadLine();
} } }
|
why_not
25 окт 2014 20:28
int unitCode; if (Unit == "RUR") unitCode = 1; else unitCode = 2; return (int) Amount + unitCode;
Возникает проблема, когда unitCode == Amount. (Например:Хешкод(2 RUR) ==хешкоду от (1 USD))
|
Максим
28 сен 2014 20:10
Firik --- Для собственных классов да, сравнивают ссылки
|
Firik
27 сен 2014 09:17
То есть получается, что если не переопределять методы "==" и Equals, то они работают идентично? using System; class SampleClass { public static void Main() { Object obj1 = new Object(); Object obj2 = new Object(); Console.WriteLine(obj1.Equals(obj2)); obj1 = obj2; Console.WriteLine(obj1.Equals(obj2)); } }
|
beronny
09 сен 2014 19:05
class Okrujnost { public double X { get; set; } public double Y { get; set; } public double R { get; set; }
public Okrujnost(double x, double y, double r) { this.X = x; this.Y = y; this.R = r; }
public override bool Equals(object obj) { if (obj == null) return false; Okrujnost o = obj as Okrujnost; if (o == null) return false; return o.X == this.X && o.Y == this.Y && o.R == this.R; }
public bool Equals(Okrujnost obj) { if (obj == null) return false; return obj.X == this.X && obj.Y == this.Y && obj.R == this.R; }
public override int GetHashCode() { int unitCode; unitCode = (int)X + (int)Y + (int)R; return unitCode; }
} class Program { static void Main(string[] args) { Okrujnost okr1 = new Okrujnost(1.4, 2.1, 4); Okrujnost okr2 = new Okrujnost(3.8, 2.2, 2.7); Okrujnost okr3 = new Okrujnost(1.4, 2.1, 4); Okrujnost okr4 = new Okrujnost(3, 44, 3);
Console.WriteLine("okr1 " + okr1.GetHashCode()); Console.WriteLine("okr2 " + okr2.GetHashCode()); Console.WriteLine("okr3 " + okr3.GetHashCode()); Console.WriteLine("okr4 " + okr4.GetHashCode());
Console.WriteLine(okr1.Equals(2)); Console.WriteLine(okr1.Equals(okr3)); Console.WriteLine(okr1.Equals(okr4));
Console.ReadKey(); } } }
Админ) так?
|
Максим
04 сен 2014 13:51
beronny --- В уроке же об этом написано. "==" cравнивает ссылки для ссылочных типов, у каждого объекта она своя. Поэтому в первом случае false. Дальше m4 присвоили ссылку на m1, теперь они указывают на одну и ту же область памяти - одинаковые ссылки - true
|
beronny
04 сен 2014 12:24
Админ, помоги ещё! Почему здесь, когда мы сравниваем m1 и m2(m1 == m2), нам выдаёт False? они же одинаковые! ? c m1 и m4( m1 == m4 ) всё наоборот?
public class Money { public decimal Amount { get; set; } public string Unit { get; set; }
public Money(decimal amount, string unit) { Amount = amount; Unit = unit; }
public override bool Equals(object obj) { if (obj == null) return false; Money m = obj as Money; // возвращает null если объект нельзя привести к типу Money if (m as Money == null) return false;
return m.Amount == this.Amount && m.Unit == this.Unit; } } class Program { static void Main(string[] args) { Money m1 = new Money(100, "RUR"); Money m2 = new Money(100, "RUR"); Money m3 = new Money(100, "USD"); Money m4 = m1; Console.WriteLine(m1.Equals(m2)); // true Console.WriteLine(m1.Equals(m3)); // false Console.WriteLine(m1 == m2); // false Console.WriteLine(m1 == m4); // true Console.ReadLine(); } }
|
AlexSerikov
14 июл 2014 21:29
Учебником мне по голове за такой алгоритм с переопределением GetHashCode(), но я особо не думал, однако считаю идею с представлением координат центра с помощью 1-й переменной double очень интересной. Что думаете, уважаемый Admin ?
class Circle { // Координаты представлены с помощью переменной double public double Center { get; set; } // Все, что до запятой - это координата по Х, а все, что после - координата по Y public double Radius { get; set; } public Circle(double Center, double Radius) { this.Center = Center; this.Radius = Radius; } public override bool Equals(object obj) { if(obj==null) return false; Circle x = obj as Circle; if(obj as Circle==null) return false; return x.Center == this.Center && x.Radius == this.Radius; } public bool Equals(Circle obj) { if (obj == null) return false; return obj.Center == this.Center && obj.Radius == this.Radius; } public override int GetHashCode() { double unitCode=Center+Radius; return (int) unitCode; } } class Program { static void Main() { Circle circle1 = new Circle(5.5, 3.0); Circle circle2 = new Circle(5.5, 3.0); Circle circle3 = new Circle(5.5, 1.0); Circle circle4 = new Circle(4.4, 3.0); Console.WriteLine("Сравниваем 1-й и 2-й круги:= "+circle1.Equals(circle2)); Console.WriteLine("Сравниваем 1-й и 3-й круги:= " + circle1.Equals(circle3)); Console.WriteLine("Сравниваем 1-й и 4-й круги:= " + circle1.Equals(circle4)); Console.WriteLine("----------------------------------"); Console.WriteLine("А теперь сверим HashCode объектов: "); Console.WriteLine("circle 1 = " + circle1.GetHashCode()); Console.WriteLine("circle 2 = " + circle2.GetHashCode()); Console.WriteLine("circle 3 = " + circle3.GetHashCode()); Console.WriteLine("circle 4 = " + circle4.GetHashCode()); Console.ReadKey(); } }
|
MrX
11 июн 2014 17:55
Проблема решена. Извините за беспокойство.
|
MrX
11 июн 2014 12:30
Объясните, пожалуйста, для чего в примере эта часть кода: *** public bool Equals(Money obj) // аргумент типа Money { if (obj == null) return false; return obj.Amount == this.Amount && obj.Unit == this.Unit; } *** Ведь метод "Equals" нами уже переопределен перед этим.
Хотелось бы разобраться, потому что домашнее задание делал по данному примеру и оно не работает правильно: при вхождении в переопределенный метод "Equals" в строке: Money m = obj as Money; объекту "m" не присваивается объект "obj" и Watch показывает, что после этой строки мой объект (образно говоря: "m") имеет значение "Null", соответственно дальше нужная часть кода не выполнятся.
Благодарен заранее за ответ.
|
Ромик
03 июн 2014 11:27
не хотелось бы захламлять, но мне тут намекнули, а я написал еще 1 интересный способ: class First { public int number; public short ordinal; public string name; public First(int number, short ordinal, string name) { this.number = number; this.ordinal = ordinal; this.name = name; } public override string ToString() { //string info; //info = string.Format(this.number + "" + this.ordinal + this.name); return this.number + "" + this.ordinal + this.name;//info; } public override bool Equals(object obj) { if (obj is First && obj != null) { if (this.ToString() == obj.ToString()) return true; } return false; } public override int GetHashCode() { return (this.ToString()).GetHashCode(); } }
|
Максим
02 июн 2014 18:06
Ромик --- Метод GetHashCode не принимает никаких аргументов: public override int GetHashCode(object obj) // это попытка переопределить несуществующий метод
if (c1.Equals(c2) && c1.GetHashCode() == c2.GetHashCode()) // сравнивать хеш-коды не нужно, чтобы удостовериться в эквивалентности объектов достаточно c1.Equals(c2)
|
Ромик
02 июн 2014 11:01
Не понял, почему у меня была ошибка, но вот переделал, чтобы все заработало class Circle { public double x; public double y; public double radius; public Circle(double x, double y, double radius) { this.x = x; this.y = y; this.radius = radius; } public override bool Equals(object obj) { if (obj is Circle && obj != null) { if (this.x == (obj as Circle).x && this.y == (obj as Circle).y && this.radius == (obj as Circle).radius) return true; } return false; } public override int GetHashCode() { int Code = 0; Code = (int)x + (int)y + (int)radius; return Code; } } class Program { static void Main(string[] args) { Circle c1 = new Circle(2, 1.2, 5); Circle c2 = new Circle(2, 1.2, 5); if (c1.Equals(c2) && c1.GetHashCode() == c2.GetHashCode()) Console.WriteLine("Окружности равны"); else Console.WriteLine("Окружности не равны"); Console.ReadKey(); } }
|
Ромик
02 июн 2014 10:34
//2 ошибки //1.Вы переопределили метод equals , но не переопределили метод GetHeshCode(в смысле это предупреждение) //2. Project.Circle.GetHeshCode(object): не найден метод, пригодный для переопределения (это ошибка) class Circle { public double x; public double y; public double radius; public Circle(double x, double y, double radius) { this.x = x; this.y = y; this.radius = radius; } public override bool Equals(object obj) { if (obj is Circle && obj != null) { if (this.x == (obj as Circle).x && this.y == (obj as Circle).y && this.radius == (obj as Circle).radius) return true; } return false; } public override int GetHashCode(object obj) { int Code = 0; if (obj is Circle && obj != null) { Code = (int)(obj as Circle).x + (int)(obj as Circle).y + (int)(obj as Circle).radius; } return Code; } } class Program { static void Main(string[] args) { Circle c1 = new Circle(2, 1.2, 5); Circle c2 = new Circle(2, 1.2, 5); Console.WriteLine(c1.GetHashCode()); Console.WriteLine(c2.GetHashCode()); if (c1.Equals(c2) && c1.GetHashCode(c1) == c2.GetHashCode(c2)) Console.WriteLine("Окружности равны"); Console.WriteLine("Окружности не равны"); Console.ReadKey(); } }
|
Максим
26 мар 2014 00:04
Nadil --- Вы говорите о перегрузке оператора "<<"? Такого в C# нет, можно лишь переопределять метод ToString но этого немного другое
|
Nadil
25 мар 2014 21:39
Круто) Все прочитал, почти как C++. Еще бы добавили перегрузку операторов вывода в консоль, допустим!
|