Поиск по строке (с применением индексатора) - C#
Формулировка задачи:
Добрый день,
Хочу, помимо всего прочего реализовать поиск по названию модели с применением индексатора, но так чтобы получить все возможные вхождения. Пока получается найти только первое (328 строка).
using System;
abstract class Device
{
protected Double price;
protected String vendor;
protected String category;
protected DateTime productionDate;
protected Byte warranty;
protected String model;
public Double Price
{
get
{
return price;
}
set
{
if (price > 0) price = value;
}
}
public String Vendor
{
get
{
return vendor;
}
set
{
vendor = value;
}
}
public String Category
{
get
{
return category;
}
set
{
category = value;
}
}
public DateTime ProductionDate
{
get
{
return productionDate;
}
set
{
productionDate = value;
}
}
public Byte Warranty
{
get
{
return warranty;
}
set
{
if (warranty > 0) warranty = value;
}
}
public String Model
{
get
{
return model;
}
set
{
model = value;
}
}
}
class Laptop : Device
{
public Laptop(Double price, String vendor, String category, DateTime productionDate, Byte warranty, String model)
{
this.price = price;
this.vendor = vendor;
this.category = category;
this.productionDate = productionDate;
this.warranty = warranty;
this.model = model;
}
public override String ToString()
{
return "Vendor: " + vendor + ", model: " + model + ", price: $" + price + ", date of production: "
+ productionDate.ToShortDateString() + ", warranty: " + warranty + " years.";
}
}
class Tablet : Device
{
public Tablet(Double price, String vendor, String category, DateTime productionDate, Byte warranty, String model)
{
this.price = price;
this.vendor = vendor;
this.category = category;
this.productionDate = productionDate;
this.warranty = warranty;
this.model = model;
}
public override String ToString()
{
return "Vendor: " + vendor + ", model: " + model + ", price: $" + price + ", date of production: "
+ productionDate.ToShortDateString() + ", warranty: " + warranty + " years.";
}
}
class Smartphone : Device
{
public Smartphone(Double price, String vendor, String category, DateTime productionDate, Byte warranty, String model)
{
this.price = price;
this.vendor = vendor;
this.category = category;
this.productionDate = productionDate;
this.warranty = warranty;
this.model = model;
}
public override String ToString()
{
return "Vendor: " + vendor + ", model: " + model + ", price: $" + price + ", date of production: "
+ productionDate.ToShortDateString() + ", warranty: " + warranty + " years.";
}
}
class Charger : Device
{
public Charger(Double price, String vendor, String category, DateTime productionDate, Byte warranty, String model)
{
this.price = price;
this.vendor = vendor;
this.category = category;
this.productionDate = productionDate;
this.warranty = warranty;
this.model = model;
}
public override String ToString()
{
return "Vendor: " + vendor + ", model: " + model + ", price: $" + price + ", date of production: "
+ productionDate.ToShortDateString() + ", warranty: " + warranty + " years.";
}
}
class Case : Device
{
public Case(Double price, String vendor, String category, DateTime productionDate, Byte warranty, String model)
{
this.price = price;
this.vendor = vendor;
this.category = category;
this.productionDate = productionDate;
this.warranty = warranty;
this.model = model;
}
public override String ToString()
{
return "Vendor: " + vendor + ", model: " + model + ", price: $" + price + ", date of production: "
+ productionDate.ToShortDateString() + ", warranty: " + warranty + " years.";
}
}
//////////////////////////////////////////////////////////////////////////////////////
class Store
{
private Device[] devices;
public Store(int size)
{
devices = new Device[size];
}
public int Length
{
get
{
return devices.Length;
}
}
public Device this[int index]
{
get
{
if (index < 0 || index >= devices.Length)
{
throw new IndexOutOfRangeException();
}
else
{
return devices[index];
}
}
set
{
devices[index] = value;
}
}
public Device this[Double price]
{
get
{
if (price <= 0.0)
{
throw new IndexOutOfRangeException();
}
return this[FindByPrice(price)];
}
}
public Device this[String name]
{
get
{
if (name.Length == 0)
{
//return null;
throw new IndexOutOfRangeException();
}
return this[FindByName(name)];
}
}
private Int32 FindByName(String name)
{
Int32 result = -1;
for (int i = 0; i < devices.Length; i++)
{
if (devices[i].Vendor == name)
{
result = i;
break;
}
}
return result;
}
public Int32 FindByPrice(Double price)
{
Int32 result = -1;
for (Int32 i = 0; i < devices.Length; i++)
{
if (devices[i].Price == price)
{
result = i;
break;
}
}
return result;
}
public Int32[] FindByPrice(Double priceFrom, Double priceTo)
{
Int32 count = 0;
for (Int32 i = 0; i < devices.Length; i++)
{
if (devices[i].Price >= priceFrom && devices[i].Price <= priceTo)
{
count++;
}
}
Int32[] result = new Int32[count];
for (Int32 i = 0, y = 0; i < devices.Length; i++)
{
if (devices[i].Price >= priceFrom && devices[i].Price <= priceTo)
{
result[y] = i;
y++;
}
}
return result;
}
}
class Program
{
static void Main(string[] args)
{
Store s = new Store(6);
s[0] = new Laptop(5700, "Samsung", "Laptops", DateTime.Parse("2015.11.23"), 2, "AAA");
s[1] = new Tablet(4700.25, "Asus", "Tablets", DateTime.Parse("2016.01.01"), 1, "BBB");
s[2] = new Smartphone(3700, "HTC", "Smartphones", DateTime.Parse("2015.10.23"), 1, "CCC");
s[3] = new Charger(150.55, "Hiawei", "Chargers", DateTime.Parse("2016.03.17"), 1, "DDD");
s[4] = new Case(80, "no name", "Cases", DateTime.Parse("2015.08.08"), 0, "EEE");
s[5] = new Laptop(6700, "Samsung", "Laptops", DateTime.Parse("2016.06.23"), 2, "FFF");
/*
try
{
foreach(int el in s.FindByPrice(4000, 6000))
{
Console.WriteLine(s[el]);
}
}
catch
{
Console.WriteLine("Ничего не найдено!");
}*/
try
{
for (int i = 0; i < s.Length; i++)
{
if (s[i] == s["Samsung"])
Console.WriteLine(s[i]);
}
}
catch
{
Console.WriteLine("Ничего не найдено!");
}
//Console.WriteLine(s["Samsung"]);
//Console.WriteLine(s[4700.25]);
}
}Решение задачи: «Поиск по строке (с применением индексатора)»
textual
Листинг программы
public IEnumerable<Device> this[String name]
{
get
{
if (name.Length == 0)
{
//return null;
throw new IndexOutOfRangeException();
}
//return devices.Where(x => x.Vendor == name);
return FindByName(name);
}
}
private IEnumerable<Device> FindByName(String name)
{
foreach (Device dev in devices) {
if (dev.Vendor == name) {
yield return dev;
}
}
}