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」を選択した場合、車には BMW と AUDI が含まれているため、ユーザーが「アウディ」と「ユーザーが「BMW」、「AUDI」、「Airplanes」、「Boing 747」を選択した場合、アプリケーションはリストを返す必要があります。 "BMW"、"Audi"、"Airplanes" の "Boing 747" ではありません。Airplanes には "Boing 747" が含まれるためです。

何か案が?

編集:

比較するタイプとタイプは実行前には不明であることに注意してください。どちらも外部ファイルからのものです。例:私の例では車を入れましたが、動物、テクノロジー、人などである可能性があります。そのため、事前にクラスを入力して作成します。

4

1 に答える 1

1

実際には、linq クエリを使用しない方が簡単ですが、単純な古いforeachループを使用すると簡単です。

まず、グループ化するための辞書を作成し、グループなどBMWに入れましょう。AudiCars

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 に答える