0

我有一个要从应用程序中过滤的 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;
    }

例如:如果用户选择“汽车”、“保时捷”,那么结果将只有“汽车”,因为没有定义保时捷。

我的问题是,我如何修改 Linq 查询以执行以下操作:如果用户选择“汽车”、“奥迪”、“宝马”,则查询返回汽车,因为汽车包括宝马和奥迪,如果用户选择“奥迪”和“ BMW”然后应用程序将返回“Audi”和“BMW”但不返回“cars”,因为它没有被选中,如果用户选择了“BMW”、“AUDI”、“Airplanes”、“Boing 747”那么应用程序应该返回列表“BMW”、“Audi”、“Airplanes” 但不是“Boing 747”,因为飞机包括“Boing 747”

任何想法?

编辑:

请注意,要比较的类型和类型在运行前是未知的,两者都来自外部文件,例如:在我的示例中,我放置了汽车,但它可以是动物、技术、人……等等,这就是为什么我无法预测预先输入和创建类。

4

1 回答 1

1

没有 linq 查询实际上更容易,但使用普通的旧foreach循环。

首先,让我们创建一个字典来分组BMWAudiCars组等:

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);
于 2013-09-05T13:39:15.000 回答