像Intersect()这样的可枚举方法与部分比较

时间:2014-12-15 21:57:08

标签: c#

C#代码:

string[] a1 = {"Yank","Yankee","MLB"};
string[] a2 = {"yan","yankeedoodle","m"};

我想在a1中搜索a2字符串

  • a2[yank]会产生"Yank""Yankee"
  • a2[yankeedoodle]收益null
  • a2[m]会产生"MLB"

类似于strstr()忽略大小写的内容

Intersect()返回完整匹配,我想要部分匹配。

是否有方法或只是做很长的路?

3 个答案:

答案 0 :(得分:3)

你正在做的事情是非常具体的,所以对于像这样的事情预先存在的任何事情都是值得怀疑的。你只需要编写逻辑,例如:

a2.ToDictionary(
    prefix => prefix, 
    prefix => a1.Where(str => str.StartsWith(
        prefix, 
        true, 
        CultureInfo.InvariantCulture)));

答案 1 :(得分:0)

因此,您希望以不区分大小写的方式从第一个集合中的第二个查找所有部分匹配。假设 partial 表示子字符串:

var A2ToA1lookup = a2.ToLookup(
    s2 => s2, 
    s2 => a1.Where(s1 => s1.IndexOf(s2, StringComparison.InvariantCultureIgnoreCase) >= 0));

您可以像使用字典一样使用它,但是如果找不到该键,则会产生一个空序列:

foreach (var matches in A2ToA1lookup["yan"])          
    Console.WriteLine(string.Join(",", matches));      // Yank,Yankee
foreach (var matches in A2ToA1lookup["yankeedoodle"])
    Console.WriteLine(string.Join(",", matches));      // -- String.Empty --
foreach (var matches in A2ToA1lookup["m"])
    Console.WriteLine(string.Join(",", matches));      // MLB

答案 2 :(得分:0)

您可以使用LINQ:

 var results = a1.Where(e1 => a2.Any(e2 => e1.ToUpper().Contains(e2.ToUpper())));