我有一个具有双重值的元组列表:
for (int x=0; x<4; x++) {
c1 = new CountTest();
}
我一直在为此添加内容,如下:
List<Tuple<string, string>> Descriptions;
我想使用Linq检索列表,其中元组中的Descriptions.Add (new Tuple<string, string> ("max", "some description"));
Descriptions.Add (new Tuple<string, string> ("joe", "some description"));
Descriptions.Add (new Tuple<string, string> ("jane", "some description"));
Descriptions.Add (new Tuple<string, string> ("max", "some other description"));
是某个值,例如Item1
。我可以使用这段代码:
"max"
但这会为 s 分配一个我不想要的元组列表。我只想要一个描述字符串列表,也就是说,它应该返回一个var s = Descriptions.Where (x => x.Item1 == "max");
,其中包含与list<string>
字符串Item1
相关的所有描述。
答案 0 :(得分:5)
使用Select
:
var s = Descriptions.Where (x => x.Item1 == "max").Select(y => y.Item2);
这将返回IEnumerable<string>
。如果您想要一个列表,您还需要在最后添加ToList
:
var s = Descriptions.Where (x => x.Item1 == "max").Select(y => y.Item2).ToList();
或者您可以使用查询语法:
var s = from d in Descriptions
where d.Item1 == "max"
select d.Item2;
这与第一个选项相同。实际上,编译器会将查询语法转换为linq的扩展方法。
答案 1 :(得分:3)
在Where()
之后,您可以使用Select()
方法仅获取description
Item2
Tuple
var s = Descriptions.Where(x => x.Item1 == "max")
.Select(x=>x.Item2); // projects only Description
,您需要执行此操作:
IEnumerable<string>
这将返回Item1
形式的所有元素,其中"max"
具有值List<string>
,如果您确实希望将其作为ToList()
,则可以添加最后{{1}}方法调用。
希望它有所帮助。
答案 2 :(得分:0)
如果您不使用其他解决方案,请尝试使用字典而不是元组列表。根据您的内容的外观,这更符合您的需求(只有您的名字是唯一的)。
Dictionary<string, string> NameDesc = new Dictionary<string, string>();
NameDesc.Add("max", "desc1");
NameDesc.Add("tim", "desc2");
var description = NameDesc["max"];
var maxExists = NameDesc.ContainsKey("max");