[c#] Contains (string) 대신 LINQ Contains (string [])를 사용하는 방법

큰 질문이 하나 있습니다.

간단히 다음과 같이 표시하는 linq 쿼리가 있습니다.

from xx in table
where xx.uid.ToString().Contains(string[])
select xx

string[]배열 의 값은 (1,45,20,10, etc …)와 같은 숫자입니다.

의 기본값은 .Contains입니다 .Contains(string).

대신이 작업이 필요합니다. .Contains(string[])

편집 : 한 사용자가 string[]. 방법을 배우고 싶지만 올바른 방향으로 나를 가리키는 사람이 있습니까?

편집 : uid도 숫자가 될 것입니다. 이것이 문자열로 변환되는 이유입니다.

누구 도와?



답변

spoulson 거의 바로 그것을 가지고 있지만, 당신은 만들어야 List<string>에서 string[]첫번째. 실제로 List<int>uid가이면 a 가 더 좋습니다 int. List<T>지원합니다 Contains(). 이렇게 uid.ToString().Contains(string[])문자열로 UID가 문자열로 배열의 값이 모두 포함되어 있음을 암시 ??? 확장 방법을 작성했다고해도 그 의미는 틀릴 것입니다.

[편집하다]

string[]Mitch Wheat가 설명 하는 대로 변경하여 작성하지 않는 한 변환 단계를 건너 뛸 수 있습니다.

[종료]

확장 메서드를 사용하지 않는 경우 원하는 것은 다음과 같습니다 (이미 int로 잠재적 uid 컬렉션이있는 경우가 아니면 List<int>()대신 사용하십시오). 이것은 내가 더 깔끔하다고 생각하는 체인 메서드 구문을 사용하며 더 많은 공급자와 쿼리를 사용할 수 있도록 int로 변환합니다.

var uids = arrayofuids.Select(id => int.Parse(id)).ToList();

var selected = table.Where(t => uids.Contains(t.uid));


답변

Contains 를 복제 하고 싶지만 배열의 경우 사용할 확장 메서드 와 샘플 코드는 다음과 같습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ContainsAnyThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            string testValue = "123345789";

            //will print true
            Console.WriteLine(testValue.ContainsAny("123", "987", "554"));

            //but so will this also print true
            Console.WriteLine(testValue.ContainsAny("1", "987", "554"));
            Console.ReadKey();

        }
    }

    public static class StringExtensions
    {
        public static bool ContainsAny(this string str, params string[] values)
        {
            if (!string.IsNullOrEmpty(str) || values.Length > 0)
            {
                foreach (string value in values)
                {
                    if(str.Contains(value))
                        return true;
                }
            }

            return false;
        }
    }
}


답변

다음을 시도하십시오.

string input = "someString";
string[] toSearchFor = GetSearchStrings();
var containsAll = toSearchFor.All(x => input.Contains(x));


답변

.NET 4.0의 LINQ에는 또 다른 옵션이 있습니다. .Any () 메서드;

string[] values = new[] { "1", "2", "3" };
string data = "some string 1";
bool containsAny = values.Any(data.Contains);


답변

또는 이미 목록에 데이터가 있고 다른 Linq 형식을 선호하는 경우 🙂

List<string> uids = new List<string>(){"1", "45", "20", "10"};
List<user> table = GetDataFromSomewhere();

List<user> newTable = table.Where(xx => uids.Contains(xx.uid)).ToList();


답변

어때 :

from xx in table
where stringarray.Contains(xx.uid.ToString())
select xx


답변

이것은 확장 메서드를 작성하는 한 가지 방법의 예입니다 (참고 : 매우 큰 배열에는 사용하지 않을 것입니다. 다른 데이터 구조가 더 적절할 것입니다 …).

namespace StringExtensionMethods
{
    public static class StringExtension
    {
        public static bool Contains(this string[] stringarray, string pat)
        {
            bool result = false;

            foreach (string s in stringarray)
            {
                if (s == pat)
                {
                    result = true;
                    break;
                }
            }

            return result;
        }
    }
}