通过其中一个值从集合中获取元组?

时间:2018-01-25 19:01:16

标签: c# data-structures collections tuples

有没有办法只通过一个元组的值来从集合中获取元组?例如,当我使用这个Tuple结构时:

public struct Tuple<T1, T2> {
    public readonly T1 Item1;
    public readonly T2 Item2;
    public Tuple(T1 item1, T2 item2) { Item1 = item1; Item2 = item2;} 
}

有没有办法让所有具有特定项目的元组(Item1或Item2)。我想到了某种HashMap,因为循环遍历元组列表并检查每个元组的匹配对于大型数据集来说是非常低效的。

3 个答案:

答案 0 :(得分:1)

如果您有这样的列表:

List<Tuple<T1, T2>> mylist;

您可以使用LINQ枚举列表中的所有元素,搜索符合以下条件的第一个元素:

var myValue = mylist.FirstOrDefault((t) => t.Item1 == "MyKey");
但是,我应该补充一点,这不是一个好的设计。有关详细信息,请参阅注释,但在我看来,元组通常不适用于严肃的任务,因为元素未命名。数据结构中的未命名元素越多,代码读取的难度就越大。我一直使用字典来完成这样的任务。在这种情况下,我认为你不应该不愿意使用字典。

答案 1 :(得分:1)

不幸的是,看起来.Net不包含任何类型的节省空间的集合类,它基于从存储的对象中提取的密钥。 KeyedCollection<>类具有正确的接口,但在内部分别存储键和值。我建议您需要创建自己的类来实现ILookup<>,但允许动态修改(遗憾的是内置的Lookup类没有)。

答案 2 :(得分:0)

如果您有Tuple<T1, T2>个对象列表,则可以使用LINQ通过指定所需条件来获取包含所需对象的新列表。以下是使用Tuple<int, string>个对象的示例:

 List<Tuple<int, string>> originalList = new List<Tuple<int, string>>();

 originalList.Add(new Tuple<int, string>(1, "Tom"));
 originalList.Add(new Tuple<int, string>(2, "Jim"));
 originalList.Add(new Tuple<int, string>(3, "Bob"));
 originalList.Add(new Tuple<int, string>(1, "Ted"));
 originalList.Add(new Tuple<int, string>(3, "Hal"));
 originalList.Add(new Tuple<int, string>(1, "Zim"));
 originalList.Add(new Tuple<int, string>(3, "Jed"));

List<Tuple<int, string>> filteredList = originalList.Where(t => t.Item1 == 3).ToList();

// filteredList contains these:
// (3, "Bob")
// (3, "Hal")
// (3, "Jed")

List<Tuple<int, string>> anotherFilteredList = originalList.Where(t => t.Item2.StartsWith("J")).ToList();

// anotherFilteredList contains these:
// (2, "Jim")
// (3, "Jed")