将字符串分隔到不在集合Dictionary中的列表中

时间:2018-05-17 07:26:31

标签: c# linq

这是我的一句话:

  

您在StackOverFlow.com上提出问题

现在我有一个字符串列表的字典集合:

Dictionary<int, List<string>> collections = new Dictionary<int, List<string>>()
{
    { 1, new List<string>() { "You", "your" } },
    { 2, new List<string>() { "Stack", "Flow" } },
};

我需要将我的字符串拆分为字符串列表,其中集合中的字符串不在那里,并将每个List键放在其位置,以便我知道从哪个列表中找到列表&#39; s项:

例如,我的句子的输出是:

&#34; 1&#34;,&#34;问&#34;,&#34; 1&#34;,&#34;问题&#34;,&#34; 2&#34;,&#34; Over&#34;,&#34; 2&#34;,&#34; .com&#34;

你可以看到这里没有列出集合中的所有单词。相反,他们的列表键被替换。 我所知道的是,我可以通过以下代码检查我的字符串是否包含其他列表中的任何单词:

listOfStrings.Any(s=>myString.Contains(s));

但是不知道如何检查列表的整个字典集合并获取每个列表键并将其替换为新的字符串列表。

4 个答案:

答案 0 :(得分:2)

Set

将导致:

static void Main()
{
    string myString = "You ask your questions on StackOverFlow.com";
    string[] collection = new string[]
    {
        "You",
        "your",
        "Stack",
        "Flow"
    };

    var splitted = myString.Split(collection, StringSplitOptions.RemoveEmptyEntries);

    foreach(var s in splitted)
    {
        Console.WriteLine("\""+s+"\"");
    }
}

您可以使用" ask " " questions on " "Over" ".com" 展平SelectMany

根据您的修改:

collections

给出:

static void Main()
{
    string myString = "You ask your questions on StackOverFlow.com";

    Dictionary<int, List<string>> collections = new Dictionary<int, List<string>>()
    {
        { 1, new List<string>() { "You", "your" } },
        { 2, new List<string>() { "Stack", "Flow" } },
    };

    foreach(var index in collections.Keys)
    {
        foreach(var str in collections[index])
        {
            myString = myString.Replace(str, index.ToString());
        }
    }

    Console.WriteLine(myString);
}
1 ask 1 questions on 2Over2.com

给出:

static void Main()
{
    string myString = "You ask your questions on StackOverFlow.com";

    Dictionary<int, List<string>> collections = new Dictionary<int, List<string>>()
    {
        { 1, new List<string>() { "You", "your" } },
        { 2, new List<string>() { "Stack", "Flow" } },
    };

    var tempColl = collections.SelectMany(c => c.Value);
    // { "You", "your", "Stack", "Flow" }

    string separator = String.Join("|", tempColl);
    // "You|your|Stack|Flow"

    var splitted = Regex.Split(myString, @"("+separator+")");
    // { "", "You", " ask ", "your", " questions on ", "Stack", "Over", "Flow", ".com" }

    for(int i=0;i<splitted.Length;i++)
    {
        foreach(var index in collections.Keys)
        {
            foreach(var str in collections[index])
            {
                splitted[i] = splitted[i].Replace(str, index.ToString());
            }
        }
    }

    foreach(var s in splitted)
    {
        Console.WriteLine("\""+s+"\"");
    }
}

注意开头的空字符串是because

  

如果在输入字符串的开头或结尾找到匹配项,   一个空字符串包含在开头或结尾   返回数组。

但您可以使用"" "1" " ask " "1" " questions on " "2" "Over" "2" ".com" 或类似内容轻松删除它。

答案 1 :(得分:2)

您可以使用/** * @NApiVersion 2.0 * @NScriptType suitelet */ define(['N/ui/serverWidget'],function(serverWidget) { function onRequest(context) { if (context.request.method === 'GET') { var form = serverWidget.createForm({ title : 'Simple Form with List type Sublist' }); var sublist = form.addSublist({ id : 'sublist', type : serverWidget.SublistType.LIST, label : 'List Type Sublist' }); var check = sublist.addField({ id : 'custpage_id', label : 'Check', type : serverWidget.FieldType.CHECKBOX }); check.updateDisplayType({displayType: serverWidget.FieldDisplayType.ENTRY}); var itm_id = sublist.addField({ id : 'custpage_item', label : 'Item Id', type : serverWidget.FieldType.TEXT }); // Set Sublist data var sublist = form.getSublist({ id : 'sublist' }); sublist.setSublistValue({ id : 'custpage_item', line : 0, value : "Text" }); sublist.setSublistValue({ id : 'custpage_item', line : 1, value : "Text" }); sublist.setSublistValue({ id : 'custpage_item', line : 2, value : "Text" }); context.response.writePage(form); }else{ } } return { onRequest: onRequest }; }); linq功能展平列表。这个新的字符串列表可以输入SelectMany函数。

Split

上面的代码导致

  

询问,问题,Over,.com

答案 2 :(得分:2)

您可以使用linq平整您的收藏:

var collections = new[]{
    new List<string> { "You", "your" },
    new List<string> { "Stack", "Flow" },
};

var target = "You ask your questions on StackOverFlow.com";

var splitparts = collections.SelectMany(list => list.Select(s => s)).Distinct().ToArray();

var result = target.Split(splitparts,StringSplitOptions.RemoveEmptyEntries);

产生所需的

" ask ", " questions on ", "Over", ".com"

Distinct()部分会从您的收藏中删除共享内容。

答案 3 :(得分:1)

But do not know how to check an entire collection of lists.

我对您的问题的解读是您在收集&#34;收藏品时遇到了问题&#34;。虽然其他人正在展示如何将列表集合压缩到单个列表中,但是能够搜索嵌套集合是一项非常有用的技能。我本着这种精神来表达这一点。

        var myString = "You ask your questions on StackOverFlow.com";

        var collections = new[]
        {
            new List<string> { "You", "your" },
            new List<string> { "Stack", "Flow" },
        };

        foreach (var listOfStrings in collections)
        {
            foreach (var word in listOfStrings)
            {
                Console.WriteLine(myString.Contains(word) ? "Yes on " + word : "No on " + word);
            }
        }

我只是输出&#34;是&#34;或&#34;不&#34;在匹配项上,但您可以从字符串中删除它们,或者用其他字符串替换它们,或者您想要执行的任何转换。我最感兴趣的是根据您问题的措辞,展示如何循环浏览List的集合[]。