在列表中查找三个匹配的项目

时间:2013-01-15 20:53:11

标签: c# string indexing tuples wildcard

我需要在Tuple<string,string,string,string>中获得具有三个给定项目的List的索引,但是第四个是什么并不重要。例如:

Listoftuples.IndexOf(new Tuple<string,string,string,string>("value1","value2","value3","this value does not matter"))

在索引方面是否存在外卡字符,或者有不同的方法可以解决这个问题?

3 个答案:

答案 0 :(得分:4)

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"));

答案 1 :(得分:2)

这并不复杂。这是一个通用的辅助方法:

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));

请注意,如果您希望将IComparer<TKey>方法设为更通用的目的,则可以将IndexOf添加为{{1}}方法的可选参数。

答案 2 :(得分:1)

虽然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;源的可枚举的当前元素源中的该元素的“索引”(理解这只适用于我们,因为我们不会更改原始列表中任何元素的顺序;如果我们首先对它进行排序,Listoftuples与传递给Select()的元素之间的索引不匹配。

    然后我们使用这个方法来生成匿名类型的元素,它为我们做两件事;首先,我们可以将元组更改为三个值的元组(每个源元组的前三个,这是我们关心的),其次,我们可以相对容易地“插入”原始元素的索引列表供以后参考。

  • FirstOrDefault()通过Select()调用的结果旋转,直到找到元组与我们正在搜索的元素匹配的元素(或者它没有找到任何东西,在这种情况下它返回null)

  • 因为FirstOrDefault()可以返回null,我们需要检查它。有很多方法可以做到这一点;我用三元语句输入的那个很简单,也很容易理解。

最后,myIndex将具有Listoftuples的第一个匹配元素的索引,或-1,这意味着Listoftuples的所有元素都不匹配您搜索的元素。