@iki90009

Как обращаться к конкретному элементу списка по двум ключам без перебора списка?

Как обращаться к конкретному элементу списка по двум ключам x, y без перебора списка?
что-то вроде ListPixels.xy
без перебора списка каждый раз foreach

public class LPixels
{
   public static List<Pixels> ListPixels = new List<Pixels>();
}

public class Pixels
{
   public int x;
   public int y;
   public string text;
}
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 4
arxont
@arxont
C# программист
LINQ

class Program
{
	static void Main()
	{
		var lpixels = new LPixels();

		lpixels.ListPixels.Add(new Pixels(1, 1, "test11"));
		lpixels.ListPixels.Add(new Pixels(1, 2, "test12"));
		lpixels.ListPixels.Add(new Pixels(2, 1, "test21"));

		var find = lpixels.ListPixels.First(x => x.x == 1 && x.y == 2);

		Console.WriteLine(find.text);
	}
}

public class LPixels
{
	public List<Pixels> ListPixels = new List<Pixels>();
}

public class Pixels
{
	public Pixels (int x, int y, string text)
	{
		this.x = x;
		this.y = y;
		this.text = text;
	}

	public int x;
	public int y;
	public string text;
}
Ответ написан
ImmortalCAT
@ImmortalCAT
C# loving
Можно так, но всё равно это обёртка над циклом
//Один элемент
var result = ListPixels.SingleOrDefault(x=> x.x = someX && x.y = someY);
//Первый элемент
result = ListPixels.FirstOrDefault(x=> x.x = someX && x.y = someY);
//коллекция элементов
var results = ListPixels.Where(x=> x.x = someX && x.y = someY);
Ответ написан
@kttotto
все, что .NET
Можно слегка извратится и сделать индексатор. Что-то подобие этого
public class Pixel
{
	public int X {get;set}
	public int Y {get;set}
	public string Text {get;set}	
}

public class LPixels
{
	public List<Pixel> ListPixels = new List<Pixel>();
  
	public Pixel this[int x, int y]
	{
		get
		{
			return ListPixels.FirstOrDefault(px => px.X == x && px.Y == y);
		}
		set
		{
			var point = ListPixels.FirstOrDefault(px => px.X == x && px.Y == y);
			if(point != null)
			{
				point.Text = value.Text;
			}
			else
			{
				var newPoint = new Point
				{
					X = x;
					Y = y;
					Text = value.Text;
				}
				
				ListPixels.Add(newPoint);
			}			
		}
	}
}

var lpixels = new LPixels();
var result = lpixels[1, 2];
lpixels[1, 2] = new Point { Text = "Test" };
Ответ написан
freeExec
@freeExec
Участник OpenStreetMap
Если вам действительно нужен быстрый поиск, то следует использовать хештаблицы, хотя бы тот же Dictionary.
Достаточно класс объявить public class Pixels : IEquatable<Pixels> объявить методы:
public bool Equals(Pixels p)
{
    return x == p.x && y == p.y;
}
public override int GetHashCode()
{
    return x.GetHashCode() ^ y.GetHashCode();
}

И хранить не в списке, а в словаре. Если важен так же и порядок, то можно использовать OrderedDictionary.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Кнопка Екатеринбург
До 100 000 руб.
Payment Systems Москва
от 160 000 до 200 000 руб.
ЛАНИТ Москва
от 80 000 до 100 000 руб.
17 авг. 2018, в 11:42
21000 руб./за проект
17 авг. 2018, в 11:12
1000 руб./в час
17 авг. 2018, в 11:09
35000 руб./в месяц