C# 如何在lambda表达式中按字符串属性名进行选择查询?
我想使用lambda select进行查询 如下图所示:C# 如何在lambda表达式中按字符串属性名进行选择查询?,c#,select,lambda,expression,C#,Select,Lambda,Expression,我想使用lambda select进行查询 如下图所示: public class Foo{ public int Id {get;set;} public string Name {get;set;} public string Surname {get;set;} } var list = new List<Foo>(); var temp = list.Select(x=> x("Name"),("Surname")); Result : A B
public class Foo{
public int Id {get;set;}
public string Name {get;set;}
public string Surname {get;set;}
}
var list = new List<Foo>();
var temp = list.Select(x=> x("Name"),("Surname"));
Result :
A B
C D
E F
G H
我不知道通用列表的类型,我有属性名称,如“名称”、“姓氏”
我想像下面这样:
public class Foo{
public int Id {get;set;}
public string Name {get;set;}
public string Surname {get;set;}
}
var list = new List<Foo>();
var temp = list.Select(x=> x("Name"),("Surname"));
Result :
A B
C D
E F
G H
下面的代码片段显示了两种情况。一个在列表中过滤,另一个创建一个新的匿名对象列表,只有名字和姓氏
List<Foo> list = new List<Foo>();
var newList = list.Select(x=> new {
AnyName1 = x.Name,
AnyName2 = x.Surname
});
var filteredList = list.Select(x => x.Name == "FilteredName" && x.Surname == "FilteredSurname");
var filteredListByLinq = from cust in list
where cust.Name == "Name" && cust.Surname == "Surname"
select cust;
var filteredByUsingReflection = list.Select(c => c.GetType().GetProperty("Name").GetValue(c, null));
List List=新列表();
var newList=list.Select(x=>new{
AnyName1=x.Name,
AnyName2=x.姓氏
});
var filteredList=list.Select(x=>x.Name==“FilteredName”&&x.Name==“FilteredSurname”);
var filteredListByLinq=来自列表中的客户
其中cust.Name==“Name”&&cust.Name==“姓氏”
选择客户;
var filteredByUsingReflection=list.Select(c=>c.GetType().GetProperty(“Name”).GetValue(c,null));
接口
如果您可以访问所讨论的类型,并且始终希望访问相同的属性,那么最好的选择是使这些类型实现相同的接口:
public interface INamable
{
string Name { get; }
string Surname { get; }
}
public class Foo : INamable
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
这将保留类型安全性,并启用如下查询:
public void ExtractUsingInterface<T>(IEnumerable<T> list) where T : INamable
{
var names = list.Select(o => new { Name = o.Name, Surname = o.Surname });
foreach (var n in names)
{
Console.WriteLine(n.Name + " " + n.Surname);
}
}
我相信你可以摆弄一下,达到你想要达到的目标。这还不清楚。请提供示例输入/所需输出。请尝试使用动态LINQ库。希望这能解决你的问题。请查看以下链接您想创建一个仅使用名称或姓氏的匿名对象列表,还是想使用特定名称和姓氏筛选列表?我只有一个属性名称,我不知道通用列表的类型,我想按属性名称而不是值筛选列表。我显示了两个示例,执行两种不同的操作-一种是筛选,另一种是创建一个只有两个属性的匿名对象的新列表,即名称和姓氏。我没有说属性值,我说的是属性名称,我不知道通用列表的类型,如何使用x.Name或x.姓氏?所以你想筛选x.Name,对吗?在这种情况下,您可以使用第2个和第3个选项中的任何一个。除非我误解了你的要求?编辑你的问题后,创建匿名对象列表不解决你的问题吗?您想删除Id并创建新属性,但要使用name和姓氏的值,对吗?是的,我不能使用匿名对象,因为我不知道列表中包含哪些属性,我只知道属性名称,我更新了答案,使用属性字符串名称筛选了列表。你必须使用反射。。。
public void ExtractUsingInterface<T>(IEnumerable<T> list) where T : INamable
{
var names = list.Select(o => new { Name = o.Name, Surname = o.Surname });
foreach (var n in names)
{
Console.WriteLine(n.Name + " " + n.Surname);
}
}
public void ExtractUsingReflection<T>(IEnumerable<T> list)
{
var names = list.Select(o => new
{
Name = GetStringValue(o, "Name"),
Surname = GetStringValue(o, "Surname")
});
foreach (var n in names)
{
Console.WriteLine(n.Name + " " + n.Surname);
}
}
private static string GetStringValue<T>(T obj, string propName)
{
return obj.GetType().GetProperty(propName).GetValue(obj, null) as string;
}
public void ExtractUsingDynamic(IEnumerable list)
{
var dynamicList = list.Cast<dynamic>();
var names = dynamicList.Select(d => new
{
Name = d.Name,
Surname = d.Surname
});
foreach (var n in names)
{
Console.WriteLine(n.Name + " " + n.Surname);
}
}
IEnumerable<INamable> list = new List<Foo>
{
new Foo() {Id = 1, Name = "FooName1", Surname = "FooSurname1"},
new Foo() {Id = 2, Name = "FooName2", Surname = "FooSurname2"}
};
ExtractUsingInterface(list);
// IEnumerable<object> list... will be fine for both solutions below
ExtractUsingReflection(list);
ExtractUsingDynamic(list);
FooName1 FooSurname1
FooName2 FooSurname2
FooName1 FooSurname1
FooName2 FooSurname2
FooName1 FooSurname1
FooName2 FooSurname2