В C #, каков наилучший способ поиска списка класса одним из членов класса? - PullRequest
2 голосов
/ 12 ноября 2009

Скажем, у меня есть класс, который выглядит примерно так:

class SomeClass {
    int m_member;

    public int Member {
        get { return m_member; }
        set { m_member = value; }
    }
}

А где-то еще у меня есть список типа List<SomeClass> list.

Если я хочу найти в списке определенный экземпляр класса, я могу просто сделать

int index = list.IndexOf(someInstance);

Но если я хочу найти список по члену, я должен сделать это:

int index = -1;
for (int i = 0; i < list.Count; i++) {
    if (list[i].Member == someMember) {
        index = i;
        break;
    }
}

Есть ли лучший способ сделать это?

Ответы [ 3 ]

6 голосов
/ 12 ноября 2009
int index = list.FindIndex(m => m.Member == someMember);
3 голосов
/ 12 ноября 2009

Если вы можете использовать Linq

SomeClass aClasss = list.FirstOrDefault(item => item.Member == someMember);
1 голос
/ 17 мая 2016

Вы можете использовать расширенный метод поиска (используя отражение) для списка, как показано ниже, где имя свойства и значение поиска являются входными параметрами.

public static List<T> SearchList<T>(this List<T> list, string PropertyName, string SearchValue)
{
    return list.Select(item =>
        new
        {
            i = item,
            Props = item.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
        })
        .Where(item => item.Props.Any(p =>
        {
            var val = p.GetValue(item.i, null);
            return val != null
                && (p.Name.ToLower() == PropertyName.ToLower() || string.IsNullOrEmpty(PropertyName))
                && (val.ToString().ToLower().Contains(SearchValue.ToLower()) || string.IsNullOrEmpty(SearchValue));
        }))
        .Select(item => item.i)
        .ToList();
    }

вызов:

List<Employee> employees = new List<Employee>();
var searchedEmployees = data.SortList(serachProperty, searchValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...