2016-03-09 5 views
2

Пытается сделать функцию многократного использования, чтобы пропустить с тем же кодом. Проблема в том, что ключ от того, где я делаю совпадение, имеет другое имя. Иначе все равно.C# Linq dynamic item property

Это то, что у меня есть до сих пор. Проблема здесь: item.ITEMGROUP, который отличается в зависимости от того, что работает с этой функцией.

public List<T> FilterGroupIds<T>(List<T> list, string key, string groupids) 
{ 
    if (!string.IsNullOrEmpty(groupids)) 
    { 
     string[] groupidList = groupids.Split(new char[] { ',' }); 
     List<T> grouped = new List<T>(); 
     foreach (string groupidListItem in groupidList) 
     { 
      var mylist = list 
       .Where(item => **item.ITEMGROUP**.Contains(groupidListItem)) 
       .ToList(); 

      grouped.AddRange(mylist); 
     } 
     list = grouped; 
    } 
    return list; 
} 

Есть ли способ использовать какую-либо динамическую проверку? Пример, когда я использую строку для использования в качестве «ключа», которая может быть ITEMGROUP или что-то еще.

var mylist = list.Where(item => item[key].Contains(groupidListItem)).ToList(); 
+0

вы мо сделать ограничение на 'Т * для общего интерфейса, где ключевого У всех одно и то же имя? – HimBromBeere

ответ

2

Я бы просто передать эту часть item => item[key].Contains(groupidListItem) с делегатом:

public List<T> FilterGroupIds<T>(List<T> list, string key, string groupids, 
           Func<T,bool> condition) 
{ 
    ... 
    var mylist = list.Where(condition).ToList(); 
} 

с Func<T,bool> condition = item => **item.ITEMGROUP**.Contains(groupidListItem);. Таким образом, вы можете повторно использовать функцию и передать необходимый вам фильтр в зависимости от типа T.

Также вам не нужен Еогеасп для этого:

return list.Where(item => groupIdList.Any(g => item.ITEMGROUP.Contains(g)) 
      .ToList(); 

таких же, как

foreach (string groupidListItem in groupidList) 
{ 
    var mylist = list 
     .Where(item => **item.ITEMGROUP**.Contains(groupidListItem)) 
     .ToList(); 

    grouped.AddRange(mylist); 
} 
list = grouped; 
return list; 
+0

Я не совсем понимаю, как использовать функцию FilterGroupIds (Список список, строковый ключ, строковые группы, Func состояние). Как написать функцию делегата. Можете ли вы привести мне пример? – roady

+0

@roady 'Func myFilter = item => item.Group.Contains (groupIdListItem);' будет действительным, например. Все, что вы в противном случае использовали бы в своей функции 'Where' в функции, вы помещаете ее в' Func 'и передаете ее функции. Я мог бы привести лучший пример, если бы вы могли включить один из ваших классов в свой вопрос. –

+0

Нет подключения к базе данных из дома, но нет ошибок компиляции. 'string [] groupidList = groupids.Split (new char [] {','}); list = list.Where (item => groupidList.Any (g => item.ITEMGROUPID.Contains (g))). ToList(); ' – roady