带有筛选条件的C#查询

本文关键字:查询 条件 筛选 | 更新日期: 2023-09-27 18:30:13

我有一个要筛选的TransportType列表应用程序应该将用户的选择与该列表进行比较,然后只返回他所选择的内容,该内容应该在定义的列表中

 private static readonly string[] ValidTransportType = new string[]
    {
        "Cars", 
        "Airplans", 
        "Audi",
        "BMW", 
        "Airbus A333", 
        "Boing 747",
    };
    public static IEnumerable<string> GetSelectedTypes(IEnumerable<string> userSelection )
    {
        var list = (from transport in ValidTransportType
                    where userSelection.Contains(transport)
                    select transport).ToList();
        return list;
    }

例如:如果用户选择"Car"、"Porsche",则结果将仅为"Car(汽车)",因为没有定义保时捷。

我的问题是,如何修改Linq查询以执行以下操作:如果用户选择了"汽车"、"奥迪"、"宝马",则查询返回汽车,因为汽车包括宝马和奥迪,如果用户选择"奥迪"answers"宝马"则应用程序将返回"奥迪"或"宝马"但不返回"汽车",因为未选择;如果用户选择的是"宝马"、"Audi"、"飞机"、"Boing 747",则应用程序应返回"宝马","飞机"但不是"波音747",因为飞机包括"波音747"

有什么想法吗?

编辑:

请注意,要比较的类型和类型在运行时之前是未知的,都来自外部文件,例如:在我的例子中,我放了汽车,但它可以是动物、技术、人。。。等等,这就是为什么我不能提前预测类型和创建类。

带有筛选条件的C#查询

实际上,没有linq查询,但有一个简单的旧foreach循环会更容易。

首先,让我们创建一个字典,将BMWAudi分组为Cars组等

var d = new Dictionary<string, List<string>>();
string[] items = {"Cars,BMW", "Cars,Audi", "Animals,Dog"};
foreach (var item in items)
{
    // TODO: use better variable names
    // you probably use a csv parser for this
    var s = item.Split(',');
    // fill the dictionary. 
    if (!d.ContainsKey(s[0]))
        d[s[0]] = new List<string>();
    d[s[0]].Add(s[1]);
}

然后,GetSelectedTypes的实现可以是这样的:

public static IEnumerable<string> GetSelectedTypes(Dictionary<string, List<string>> validTypes, IEnumerable<string> userSelection )
{
    foreach (var kvp in validTypes)
        // if the key is in userSelection, only return the key, but no items
        if (userSelection.Contains(kvp.Key))
            yield return kvp.Key;
        // if not, only return valid items
        else 
            foreach (var item in kvp.Value)
                if (userSelection.Contains(item))
                    yield return item;
}

简单测试:

string[] userSelection = {"Cars", "Audi", "Dog"};
// will be [Cars, Dog], because Cars include Audi
GetSelectedTypes(d, userSelection);
string[] userSelection2 = {"BMW", "Audi", "Dog", "Animals"};
// will be [BMW, Audi, Animals] because Animals include Dog
GetSelectedTypes(d, userSelection2);