字符串列表包含所有子组件

时间:2018-05-14 22:02:20

标签: c#

字符串列表G是:

[0] : {"1,2,5"}
[1] : {"1,2,4,5,6"}
[2] : {"2,4,6"}
[3] : {"1,4,6"}

通过以下命令,我们得出结论:列表G [3]中存在"1,4"

if (G[i].Contains("1,4")) { //code here }

如何修改上述命令,除了功能(包含),列表G [1]中存在"1,4"

程序代码

    for (int i = 0; i < candid.Count; i++) 
    {
        foreach (TransactionTP b in transactions)
        {
            string search = candid[i];
            var searchNumbers = search.Split(',').Select(int.Parse).ToList();
            for (int j = 0; j < G.Count; j++)
            {
                IEnumerable<int> numbers = G[j].Split(',').Select(int.Parse);
                int idx = 0;
                foreach (var number in numbers)
                {
                    if (number == searchNumbers[idx])
                    {
                        idx++;
                    }
                    if (idx == searchNumbers.Count)
                    {
                        arraye[i] = arraye[i] + (b.transactionUtility);
                        break;
                    }
                }
            }
        }
    }

更新

搜索词的顺序很重要。

2 个答案:

答案 0 :(得分:1)

为了保持你匹配的集合的顺序go(在这种情况下是4,1),你需要评估每个字符串,跟踪你在匹配中的位置。

string[] G = new[]
{
    "1,2,5",
    "1,2,4,5,6",
    "2,4,6",
    "1,4,6"
};

string search = "1,4";
var searchNumbers = search.Split(',').Select(int.Parse).ToList();

for (int i = 0; i < G.Length; i++)
{
    // Convert the string into an enumeration of numbers
    IEnumerable<int> numbers = G[i].Split(',').Select(int.Parse);

    // Index to keep track of the search
    int idx = 0;

    // Loop through the input set sequentially
    foreach (var number in numbers)
    {
        // Check if the input matches the next expected number
        if (number == searchNumbers[idx])
        {
            idx++;
        }

        if (idx == searchNumbers.Count)
        {
            Console.WriteLine("String {0} matched", G[i]);
            break;
        }
    }
}

答案 1 :(得分:1)

使用执行此操作的方法替换您的单个Contains调用:

bool passes = false;
for(int i = 0; i < G.Length; i++)
{
    List<string> temp = new List<string>();
    if(G[i].Contains(","))
    {
        temp = G[i].Split(",");
    }
    else
    {
        temp = G[i];
    }

    if(temp.Contains("1") && temp.Contains("4")
    {
        passes = true;
    }
} 

return passes;

这消除了匹配&#34; 10&#34;或&#34; 41&#34;等等 它也不关心你的元素是否被排序,即使你说它们是。无论&#34; 1&#34;之间的条目数如何,它也将匹配。和&#34; 4&#34;在列表中。

你可以在满足匹配作为匹配之前接受任意数量的输入,如果你想这样做,我会把它留给你。