Как проверить содержит ли List структуру с определенными полями?
Есть структура, обьект и лист:
Palyer{
int data;
int a;
Col b;
};
List<Player> A;
Player B;
Нужно проверить:
(A[i].a == B.a && A[i].a == B.b) == true?
Можно ли сделать эту проверку типа так: A.Contains(B)? Я пробовал, но похоже, что A.Contains(B) проверяет:
(A[i].a == B.a && A[i].a == B.b && A[i].data==B.data) == true
Ответы (2 шт):
Автор решения: aepot
→ Ссылка
Можно так, "в лоб" с помощью Linq
if (A.Any(x => x.a == B.a && x.b == B.b && x.data == B.data))
{
// содержит как минимум один такой элемент, но может и больше
}
else
{
// не содержит
}
Автор решения: return
→ Ссылка
Складывается ощущение, что тут засели сплошные функциональщики, которые используют неэффективный с точки зрения оптимизации LINQ. Используйте старый как мир Array.Find / List.Find:
int FindIndex(List<Player> players, Player player)
{
// checks
return players.FindIndex(p => p.a == player.a && p.b == player.b);
}
Я не понимаю только 1-го: зачем вам struct Player?! Сделайте так:
public sealed class Entity
{
public Vector2 Position { get; set; }
public Vector2 Velocity { get; set; }
public EntityBehavior Behavior { get; set; }
public object Tag { get; set; }
// ...
public Entity(/*...*/) { /*...*/ }
}
Всегда переопределяйте Equals в структуре, т. к. стандартная реализация у структур сравнивает все поля через рефлексию. Рефлексию! Это оч. медленно (читайте Рихтера (CLR via C#)).