在列表中查找匹配了三个项目的元组
本文关键字:三个 项目 元组 列表 查找 | 更新日期: 2023-09-27 17:53:18
我需要在具有三个给定项的List
中获得Tuple<string,string,string,string>
的索引,但第四个是什么并不重要。例如:
Listoftuples.IndexOf(new Tuple<string,string,string,string>("value1","value2","value3","this value does not matter"))
当涉及到索引时,是否有通配符,或者有不同的方法?
int index = Listoftuples.FindIndex(t => t.Item1 == "value1" && t.Item2 == "value2" && t.Item3 == "value3");
您可能想要创建一个函数来创建谓词:
Func<Tuple<string,string,string,string>, bool> CreateMatcher(string first, string second, string third)
{
return t => t.Item1 == first && t.Item2 == second && t.Item3 == third;
}
然后你可以使用
int index = Listoftuples.FindIndex(CreateMatcher("value1", "value2", "value3"));
没有那么复杂。这里有一个通用的辅助方法:
public static int IndexOf<TSource, TKey>(this IEnumerable<TSource> source, TKey key
, Func<TSource, TKey> selector)
{
int i = 0;
foreach (var item in source)
{
if (object.Equals(selector(item), key))
return i;
i++;
}
return -1;
}
现在您有了一个采用选择器的IndexOf
方法,它很简单:
list.IndexOf(Tuple.Create("value1", "value2", "value3")
, item => Tuple.Create(item.Item1, item.Item2, item.Item3));
请注意,如果您想使IndexOf
方法更通用,可以将IComparer<TKey>
作为可选参数添加到该方法中。
虽然Oded的答案是正确的,但Linq有一种内置的方法来完成几乎所有基于列表的事情,所以你不必自己滚动。
var myElement = (Listoftuples.Select((x,i)=>new {Index = i,
Element = Tuple.Create(x.Item1, x.Item2, x.Item3})
.FirstOrDefault(a=>a.Element == TupleToSearchFor);
var myIndex = myElement == null ? -1 : myElement.Index;
分解:
Select((方法有一个重载,它接受带有两个参数的lambda;源可枚举的当前元素和;索引";(请理解,这只对我们有效,因为我们没有更改原始列表中任何元素的顺序;如果我们先对其进行排序,则Listoft元组和传递到Select((中的元素之间的索引将不匹配。
然后,我们使用这种方法来生成匿名类型的元素,这为我们做了两件事;首先,我们可以将元组更改为三个值的元组(每个源元组的前三个值,这是我们关心的值(,其次,我们可以相对容易地";"螺栓连接";原始列表中元素的索引,以供以后参考。
FirstOrDefault((遍历Select((调用的结果,直到它找到一个Tuple与我们正在搜索的元素匹配的元素(或者它没有找到任何东西,在这种情况下它返回null(。
因为FirstOrDefault((可能返回null,我们需要检查它。有很多方法可以做到这一点;我所说的三元语句,非常简单易懂。
最后,myIndex将具有Listoft元组的第一个匹配元素的索引,或-1,这意味着Listoft元组中没有一个元素与您搜索的元素匹配。