带有筛选条件的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"
有什么想法吗?
编辑:
请注意,要比较的类型和类型在运行时之前是未知的,都来自外部文件,例如:在我的例子中,我放了汽车,但它可以是动物、技术、人。。。等等,这就是为什么我不能提前预测类型和创建类。
实际上,没有linq查询,但有一个简单的旧foreach
循环会更容易。
首先,让我们创建一个字典,将BMW
和Audi
分组为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);