有没有办法使用部分填充的对象搜索List <T>?

fyr*_*ace 3 c# linq list

希望能够填充对象的任何属性并在集合中搜索与给定属性匹配的对象.

class Program
{
    static List<Marble> marbles = new List<Marble> { 
        new Marble {Color = "Red", Size = 3},
        new Marble {Color = "Green", Size = 4},
        new Marble {Color = "Black", Size = 6}
    };

    static void Main()
    {
        var search1 = new Marble { Color = "Green" };
        var search2 = new Marble { Size = 6 };
        var results = SearchMarbles(search1);
    }

    public static IEnumerable<Marble> SearchMarbles(Marble search)
    {
        var results = from marble in marbles
                      //where ???
                      //Search for marbles with whatever property matches the populated properties of the parameter
                      //In this example it would return just the 'Green' marble
                      select marble;
        return results;
    }

    public class Marble
    {
        public string Color { get; set; }
        public int Size { get; set; }
    }

}
Run Code Online (Sandbox Code Playgroud)

cuo*_*gle 5

不可否认,这很有意思,花时间.首先,您需要获取search具有与默认值不同的值的对象的所有属性,此方法使用反射是通用的:

var properties = typeof (Marble).GetProperties().Where(p =>
                {
                    var pType = p.PropertyType;
                    var defaultValue = pType.IsValueType 
                            ? Activator.CreateInstance(pType) : null;

                    var recentValue = p.GetValue(search);

                    return !recentValue.Equals(defaultValue);
                });
Run Code Online (Sandbox Code Playgroud)

然后你可以使用LINQ All过滤:

var results = marbles.Where(m => 
                         properties.All(p => 
                         typeof (Marble).GetProperty(p.Name)
                                        .GetValue(m) == p.GetValue(search)));
Run Code Online (Sandbox Code Playgroud)

Ps:此代码已经过测试