2012-02-22 3 views
0

У меня есть список, который содержит много объектов. Я хочу найти объект в этом списке, чтобы каждое свойство было равно объекту в списке. , например:Найти объект В базе списка на другом объекте

list.Add(object1,object2,object3,object4); 
// for example I want found object3 
//list.find(object3) 

и у меня есть проблема, которую я должен проверить каждый его свойства, кроме одного. например объект имеет такие свойства (int prop1, int prop2, int prop3). Я хочу, чтобы найденный объект утверждал, что prop1 и prop2 равны любому элементу списка;

ответ

2

Переопределить метод Equals - это путь.

Или вы можете попытаться написать отражение функции функции поиска, чтобы динамически проверить свойства этих объектов.

Пожалуйста, проверьте статью здесь: http://www.sidesofmarch.com/index.php/archive/2007/08/03/use-reflection-to-compare-the-properties-of-two-objects/

+0

Я не должен использовать для или какой-либо цикл для реализации функции равенства или поиска. Если я переопределяю или пишу любой метод, я должен использовать цикл. Спасибо за Ваше внимание. искренне вы M.Bagheri –

1

Таким образом, кажется, что вы хотели бы получить Contains-метод Списка, чтобы работать для вас.

Посмотрите здесь: MSDN List.Contains

В соответствии с этим, вы можете реализовать IEquatable в объект, чтобы сделать это.

Надеюсь, что это поможет. Cheers Sascha

+0

благодарим вас за внимание и отличный ответ. Это очень хорошая идея для меня, но когда я использую эту команду, мой код не вызывает метод Equals. Я использую динамическую переменную в свой список, может ли этот тип вызвать проблему. –

+0

Содержит метод, который автоматически вызовет этот метод, чтобы проверить, находится ли объект в списке. Вы установили точку останова в своих равных и посмотрели, вызвана ли она? –

+0

Динамика не так проста в обращении с помощью Equals. С объектом типа нет проблемы с выполнением примерно так: public override bool Equals (object other) { var pi = other.GetType(). GetProperty ("Test"); var value = pi.GetValue (другое, null); return (значение.ToString() == Test); } –

0

Всегда есть способ сделать что-то. Linq. Например:

var haystack = new List<Tuple<int, bool, string>>() 
     { 
      new Tuple<int, bool, string>(1, true, "one"), 
      new Tuple<int, bool, string>(2, false, "two"), 
      new Tuple<int, bool, string>(3, true, "three"), 
      new Tuple<int, bool, string>(4, true, "four") 
     }; 

var needle = new Tuple<int, bool, string>(3, true, "three"); 
var found = 
    haystack.FirstOrDefault(
     t => t.Item1 == needle.Item1 && t.Item2 == needle.Item2 && t.Item3 == needle.Item3); 
Assert.AreSame(haystack[2], found); 

Испытание Assert.AreSame проходит, когда я запускаю это.

Смежные вопросы