C# - 如何使用 Select LINQ 方法使用动态属性列表中的属性
C# - How to use Select LINQ method using properties from a dynamically list of properties
假设我们有一个名为 Person
的简单 class,其属性为 FirstName, LastName, Age
。
现在我有一个属性列表作为字符串列表。
var props = new List<string> { "FirstName", "Age"}.
现在我有 List
个 Person
个对象。
var persons = new List<Person> {....}
如何使用 Select
LINQ 方法只获取 props
中出现的 Person 属性?
var result = persons.Select(p => code here)
结果应为匿名对象列表,其中匿名对象应包含 props
列表中的属性。
你能试试这个吗:
IEnumerable<string> personProps = typeof(Person).GetProperties().Select(p => p.Name);
List<string> props = new List<string> { "FirstName", "Age"};
IEnumerable<string> selectedProps = props.Where(p => personProps.Contains(p));
如果我答对了你的问题,你想要 trim 你的 Person 对象。
如果那是正确的,我建议在你的 Person class 中创建一个实例方法,让你有机会创建一个未命名的对象或元组(例如像这里:) directly from your Person instanciated object. You just need to pass your props List for matching the properties (like here: enter link description here),然后就使用它Select 语句中的方法。
试试这个代码。它已在 Visual Studio 中测试并正常工作
var props = new List<string> { "FirstName", "Age" };
var persons = new List<Person> {
new Person { FirstName = "FirstName1", LastName = "FirstName1", Age=10},
new Person { FirstName = "FirstName2", LastName = "FirstName2", Age=20},
new Person { FirstName = "FirstName3", LastName = "FirstName3", Age=30}
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(persons);
var jArray = JArray.Parse(json);
List<JObject> list = new List<JObject>();
foreach (var item in jArray)
{
JObject jsonObj = new JObject();
foreach (var prop in props)
{
foreach (JProperty jprop in item)
{
if (jprop.Name == prop)
jsonObj.Add(jprop);
}
}
list.Add(jsonObj);
}
json = JsonConvert.SerializeObject(jsonList);
要使用它,您可以转换为字典,例如
var dictArray = JsonConvert.DeserializeObject<Dictionary<string, object>[]>(json);
或元组列表或键值对
List<(string,object)> values = dictArray.SelectMany(i=>i).Select(i =>(i.Key,i.Value)).ToList();
输出
FirstName FirstName1
Age 10
FirstName FirstName2
Age 20
FirstName FirstName3
Age 30
或者您可以转换为动态对象
dynamic eo = dictArray.Select( e=> e.Aggregate(new ExpandoObject() as IDictionary<string, Object>,
(a, p) => { a.Add(p.Key, p.Value); return a; })).ToList();
测试
var firstName = eo[1].FirstName; //FirstName2
class
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
假设我们有一个名为 Person
的简单 class,其属性为 FirstName, LastName, Age
。
现在我有一个属性列表作为字符串列表。
var props = new List<string> { "FirstName", "Age"}.
现在我有 List
个 Person
个对象。
var persons = new List<Person> {....}
如何使用 Select
LINQ 方法只获取 props
中出现的 Person 属性?
var result = persons.Select(p => code here)
结果应为匿名对象列表,其中匿名对象应包含 props
列表中的属性。
你能试试这个吗:
IEnumerable<string> personProps = typeof(Person).GetProperties().Select(p => p.Name);
List<string> props = new List<string> { "FirstName", "Age"};
IEnumerable<string> selectedProps = props.Where(p => personProps.Contains(p));
如果我答对了你的问题,你想要 trim 你的 Person 对象。
如果那是正确的,我建议在你的 Person class 中创建一个实例方法,让你有机会创建一个未命名的对象或元组(例如像这里:
试试这个代码。它已在 Visual Studio 中测试并正常工作
var props = new List<string> { "FirstName", "Age" };
var persons = new List<Person> {
new Person { FirstName = "FirstName1", LastName = "FirstName1", Age=10},
new Person { FirstName = "FirstName2", LastName = "FirstName2", Age=20},
new Person { FirstName = "FirstName3", LastName = "FirstName3", Age=30}
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(persons);
var jArray = JArray.Parse(json);
List<JObject> list = new List<JObject>();
foreach (var item in jArray)
{
JObject jsonObj = new JObject();
foreach (var prop in props)
{
foreach (JProperty jprop in item)
{
if (jprop.Name == prop)
jsonObj.Add(jprop);
}
}
list.Add(jsonObj);
}
json = JsonConvert.SerializeObject(jsonList);
要使用它,您可以转换为字典,例如
var dictArray = JsonConvert.DeserializeObject<Dictionary<string, object>[]>(json);
或元组列表或键值对
List<(string,object)> values = dictArray.SelectMany(i=>i).Select(i =>(i.Key,i.Value)).ToList();
输出
FirstName FirstName1
Age 10
FirstName FirstName2
Age 20
FirstName FirstName3
Age 30
或者您可以转换为动态对象
dynamic eo = dictArray.Select( e=> e.Aggregate(new ExpandoObject() as IDictionary<string, Object>,
(a, p) => { a.Add(p.Key, p.Value); return a; })).ToList();
测试
var firstName = eo[1].FirstName; //FirstName2
class
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}