2

就像在标题中一样。我得到了一个字符串数组和第二个字符串数组。我想以这种模式显示结果:第一个数组的第一个元素 - 然后是第二个数组中出现在第一个数组的第一个元素中的所有元素。在第一个数组的第二个元素和第二个数组中出现在第一个数组的第二个元素中的所有元素之后。等等。例如:

string[] arrayA = {"Lorem ipsum dolor sit amet, justo", "notgin like good cold beer"};
string[] arrayB = {"justo","beer","lorem"}
for (int i = 0; i < arrayA.Length; i++)
   {
      Console.WriteLine(arrayA[i]);

       for (int j = 0; j < arrayB.Length; j++)
       {
          int controlIndex = arrayA[i].IndexOf(arrayB[j]);
          if (controlIndex != -1)
          {
               Console.Write(" :--contains-->" + arrayB[j]);
          }

    }

}

所以结果应该是这样的:

  • Lorem ipsum dolor sit amet, justo :--包含--> justo,lorem
  • notgin 喜欢好的冰镇啤酒:--包含-->啤酒

但我的结果是: - Lorem ipsum dolor sit amet, justo :--contains--> justo - notgin like good cold beer :--contains--> beer

所以你可以看到没有列出lorem

4

8 回答 8

2

如果您将问题分解一些,这一点也不难。首先,远离处理数组和索引。只需使用IEnumerable<T>,它会让您的生活更轻松。

这是我的看法:

首先,您想从数组中查找所有字符串needles,它们是字符串的一部分haystack

public static IEnumerable<string> MatchingStrings(string haystack, IEnumerable<string> needles)
{
    return needles.Where(needle => haystack.Contains(needle));
}

这将返回一个 IEnumerable,needles其中包含haystack.

然后,您想简单地遍历所有搜索字符串,我将其称为haystacks.

    static void Main(string[] args)
    {
        var haystacks = new[] {
            "Lorem ipsum dolor sit amet, justo",
            "notgin like good cold beer"
        };

        var needles = new[] {"justo", "beer", "lorem"};

        foreach (var haystack in haystacks) {
            Console.Write(haystack + "  contains --> ");
            var matches = MatchingStrings(haystack, needles);

            Console.WriteLine(String.Join(",", matches));
        }

        Console.ReadLine();
    }

注意String.Contains()区分大小写。所以“Lorem”不会匹配“lorem”。如果您想要这种行为,您必须先将它们转换为小写。

public static IEnumerable<string> MatchingStringsCaseInsensitive(string haystack, IEnumerable<string> needles)
{
    var h = haystack.ToLower();
    return needles.Where(needle => h.Contains(needle.ToLower()));
}
于 2012-07-22T00:36:14.010 回答
1
string[] arrayA = {"Lorem ipsum dolor sit amet, justo", "notgin like good cold beer"};
string[] arrayB = {"justo","beer","lorem"};

foreach (var s in arrayA)
{
    Console.Write(s + " contains: " +
                  string.Join(",", arrayB.Where(s.Contains)));
}

如果你想忽略大小写:

foreach (var s in arrayA)
{
    Console.Write(s + " contains: " +
                  string.Join(",", arrayB.Where(x =>
                      s.IndexOf(x, StringComparison.OrdinalIgnoreCase) != -1)));
}
于 2012-07-22T00:30:20.417 回答
1
foreach(var a in arrayA)
{
    Console.WriteLine("a: " + a);
    Console.WriteLine("bs: " + 
        String.Join(", ", arrayB.Where(b => a.IndexOf(b) > -1)));
}

另外,如果您的意思是不关心大小写,那a.IndexOf(b)就是a.IndexOf(b, StringComparison.OrdinalIgnoreCase).

于 2012-07-22T00:33:11.320 回答
1

这是 Linq 解决方案:

var result = arrayA.Select(a => new{
    A = a,
    bContains = arrayB.Where(b => a.IndexOf(b, 0, StringComparison.CurrentCultureIgnoreCase) > -1)            
});

foreach(var x in result)
{
    Console.WriteLine("{0}:--contains-->{1}", x.A, string.Join(",", x.bContains));
}

这是一个演示:http: //ideone.com/wxl6I

于 2012-07-22T00:37:40.477 回答
1

这是我的尝试

string[] arrayA = {"lorem ipsum dolor sit amet, justo", "notgin like good cold beer"};
string[] arrayB = {"justo", "beer", "lorem"};

foreach (var item in from a in arrayA from b in arrayB where a.Contains(b) select new {a, b})
{
    Console.WriteLine(item.a);
    Console.WriteLine(item.b);
}

注意:Contains是区分大小写的比较,您需要编写自定义比较器(正如其他答案已经完成的那样)

于 2012-07-22T00:38:46.277 回答
0

Lorem 大写。尝试使用不区分大小写的搜索: .indexOf(string, StringComparison.CurrentCultureIgnoreCase)

于 2012-07-22T00:39:29.210 回答
0

我已经给了你所有可能的答案,但是 contains 方法会产生一个问题,在下面提到的情况下它也会返回 true。

reference_string = "Hello Stack Overflow"
test_string = "Over"

所以尽量避免包含,因为包含方法会

“返回一个值,指示指定的 System.String 对象是否出现在此字符串中”

注意:添加 StringComparer.OrdinalIgnoreCase 是为了不区分大小写。

/// <summary>
        /// Compares using binary search
        /// </summary>
        /// <param name="input"> search input</param>
        /// <param name="reference"> reference string</param>
        /// <returns> returns true or false</returns>
        public bool FatMan(string input, string reference)
        {
            string[] temp = reference.Split();
            Array.Sort(temp);
            List<string> refe = new List<string> { };
            refe.AddRange(temp);

            string[] subip = input.Split();
            foreach (string str in subip)
            {
                if (refe.BinarySearch(str, StringComparer.OrdinalIgnoreCase) < 0)
                {
                    return false;
                }
            }

            return true;
        }

        /// <summary>
        /// compares using contains method
        /// </summary>
        /// <param name="input"> search input</param>
        /// <param name="reference"> reference string</param>
        /// <returns> returns true or false</returns>
        public bool Hiroshima(string input, string reference)
        {
            string[] temp = reference.Split();
            Array.Sort(temp);
            List<string> refe = new List<string> { };
            refe.AddRange(temp);
            string[] subip = input.Split();

            foreach (string str in subip)
            {
                if (!refe.Contains(str, StringComparer.OrdinalIgnoreCase))
                {
                    return false;
                }
            }

            return true;
        }


        public bool Nakashaki(string input, string reference)
        {
            string[] temp = reference.Split();
            Array.Sort(temp);
            List<string> refe = new List<string> { };
            refe.AddRange(temp);
            string[] subip = input.Split();

            int result = (from st in subip where temp.Contains(st, StringComparer.OrdinalIgnoreCase) select st).Count();

            if (result <= 0)
            {
                return false;
            }

            return true;
        }

        /// <summary>
        /// compares using contains method
        /// </summary>
        /// <param name="input"> search input</param>
        /// <param name="reference"> reference string</param>
        /// <returns> returns true or false</returns>
        public bool LittleBoy(string input, string reference)
        {
            string[] subip = input.Split();
            foreach (string str in subip)
            {
                if (!reference.Contains(str))
                {
                    return false;
                }
            }

            return true;
        }
于 2013-12-12T14:12:22.413 回答
-1
 bool oupt ;
 string[] strarray1 = new string[3]{"abc","def","ghi" };
 string[] strarray2 = new string[4] { "648", "888", "999", "654" };
 if (strarray1.All(strarray.Contains))
    oupt = true;
 else
    oupt = false;
于 2014-09-06T23:02:18.077 回答