2013-09-17 1 views
2

У меня есть список классов и список строк. Список строк содержит имена полей, которые соответствуют полям в классе. Есть ли запрос Linq, который может определить, какие разные поля являются общими между двумя списками? См. Пример ниже.linq определить, если имена полей в списке <string> находятся в подборе полей из списка <Class>

public class ClassA 
{ 
    public string Field1{get; set;} 
    public decimal Field2{get; set;} 
    public int Field3{get; set;} 

    public ClassA(string field1, decimal field2, int field3) 
    { 
     Field1 = field1; 
     Field2 = field2; 
     Field3 = field3; 
    } 
} 

public void Main() 
{ 
    List<ClassA> lstClass = new List<ClassA>(); 
    lstClass.Add(new ClassA("value1", 1.23, 1)); 
    lstClass.Add(new ClassA("value2", 0.32, 3)); 
    lstClass.Add(new ClassA("value3", 2.34, 9)); 

    List<string> lstNames = "Field1,Field2".ToString().Split(',').ToList(); 

    // How to find intersection using linq of lstClass and lstNames (should be list containing Field1 and Field2). 
} 

Второй Followup вопрос заключается в том, чтобы получить список полей из lstClass (должен быть список строк, содержащих «Field1», «Field2», и «field3»).

Спасибо,

Lee

+0

Не ясно. Вы можете это прояснить? Пример ввода и ожидаемого результата будет лучше –

ответ

3

Используйте Reflection:

typeof(ClassA).GetProperties(
     BindingFlags.Public | BindingFlags.Instance) 
    .ToList() // Returns all the public instance properties of ClassA 

Так что ваше решение:

var lstFieldNames = typeof(ClassA).GetProperties(
     BindingFlags.Public | BindingFlags.Instance) 
     .Select(p=>p.Name).ToList() 

var intersect = lstFieldName.Intersect(lstNames); 
+0

Это отлично работает. Есть ли способ получить значения вместе с именами в пересечении? –

+0

см. Мой второй ответ – Alireza

0

Чтобы получить значения пересечения:

var lstFieldNames = typeof(ClassA).GetProperties(
     BindingFlags.Public | BindingFlags.Instance) 
     .Select(p=>p.Name).ToList() 

var intersect = lstFieldName.Intersect(lstNames); 
var type = typeof(ClassA); 
var myObject = new ClassA(); // or any other object you want its properties values 
var values = intersect.Select(p => new { 
      Name = p, 
      Value = type 
        .GetProperty(p, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public) 
        .GetValue(myObject, null) 
      }); 
+0

Похоже, что это сработает - но у меня есть дополнительное усложнение. Я использую общий метод, поэтому не могу получить myObject. Как я могу определить myObject и, следовательно, значения? –

+0

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

+0

Уверен-у меня есть способ: public object [,] ExtractObjectArrayFromList (Список lstData, List lstColumns). lstData имеет данные, но может быть от ClassA, ClassB и т. д. lstColumns - это список имен столбцов. Без необходимости прокручивать каждую строку lstData (как я делаю сейчас), я хочу получить пересечение, как вы указали. Мне нужны значения, но, чтобы поместить результат. Я надеюсь получить результат IEnumerable, содержащий имена полей и значения полей, которые затем можно прокрутить и поместить в массив объектов. Я могу отправить фрагмент, если это необходимо. –

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