C# 如何在lambda表达式中按字符串属性名进行选择查询?

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

我想使用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
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