Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在从String.Split创建的字符串列表上进行相交_C#_Linq - Fatal编程技术网

C# 如何在从String.Split创建的字符串列表上进行相交

C# 如何在从String.Split创建的字符串列表上进行相交,c#,linq,C#,Linq,我通过执行String.Split()创建了3个字符串列表。之后,当我在这些列表上进行交集时,结果并不是我所期望的。 代码1(不工作) string a=“援助,投标”; 字符串b=“[vs | AID | 1365]”; 字符串c=“[vs | BID | 1365]”; List la=新列表(); 字符串[]k=a.Split(“,”.ToCharArray(),StringSplitOptions.RemoveEmptyEntries); foreach(k中的字符串p) { la.添加

我通过执行String.Split()创建了3个字符串列表。之后,当我在这些列表上进行交集时,结果并不是我所期望的。 代码1(不工作)

string a=“援助,投标”;
字符串b=“[vs | AID | 1365]”;
字符串c=“[vs | BID | 1365]”;
List la=新列表();
字符串[]k=a.Split(“,”.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
foreach(k中的字符串p)
{
la.添加(p);
}
//laaddrange(k.ToList());
List lb=新列表();
string[]kk=b.Split(“|”。.ToCharArray(),StringSplitOptions.removeMptyEntries);
foreach(kk中的字符串p)
{
lb.Add(p);
}
//lb.AddRange(kk.ToList());
列表lc=新列表();
string[]kkk=c.Split(“|”。.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
foreach(kkk中的字符串p)
{
立法会:加入(p);;
}
//lc.AddRange(kkk.ToList());
var t=la.Intersect(lb,StringComparer.InvariantCultureIgnoreCase);
Debug.WriteLine(t.Count())//打印1--对
var tt=la.Intersect(lc,StringComparer.InvariantCultureInogoreCase);
Debug.WriteLine(tt.Count())//打印0--错误!!!
我尝试了AddRange,但也不起作用。我注意到的另一件事是,如果我在“stringa”赋值中更改了AID和BID的顺序,那么intersect会找到BID而不是AID。不知道为什么

上述例程的硬编码版本可以正常工作

        List<string> la = new List<string>(); la.Add("AID"); la.Add("BID");
        List<string> lb = new List<string>(); lb.Add("[vs"); lb.Add("AID"); lb.Add("1365]");
        List<string> lc = new List<string>(); lc.Add("[vs"); lc.Add("BID"); lc.Add("1365]");
        var t = la.Intersect(lb, StringComparer.InvariantCultureIgnoreCase);
        Debug.WriteLine(t.Count()); //Prints 1.
        var tt = la.Intersect(lc, StringComparer.InvariantCultureIgnoreCase);
        Debug.WriteLine(tt.Count());//Prints 1.
List la=新列表();la.添加(“援助”);添加(“投标”);
List lb=新列表();lb.Add(“vs”);lb.Add(“AID”);lb.Add(“1365”);
列表lc=新列表();信用证增补(“vs”);信用证增补(“投标”);信用证增补(“1365”);
var t=la.Intersect(lb,StringComparer.InvariantCultureIgnoreCase);
Debug.WriteLine(t.Count())//打印1。
var tt=la.Intersect(lc,StringComparer.InvariantCultureInogoreCase);
Debug.WriteLine(tt.Count())//打印1。
更新: 下面是我最后得到的代码

    string a = "AID, BID";
    string b = "[vs|AID|1365]";
    string c = "[vs|BID|1365]";

    List<string> tla = a.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => s.Trim()).ToList();
    List<string> tlb = b.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => s.Trim()).ToList();
    List<string> tlc = c.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => s.Trim()).ToList();

    var t = tla.Intersect(tlb, StringComparer.InvariantCultureIgnoreCase);
    var tt = tla.Intersect(tlc, StringComparer.InvariantCultureIgnoreCase);
string a=“援助,投标”;
字符串b=“[vs | AID | 1365]”;
字符串c=“[vs | BID | 1365]”;
列表tla=a.Split(“,”.ToCharArray(),StringSplitOptions.RemoveEmptyEntries)
.选择(s=>s.Trim()).ToList();
List tlb=b.Split(“|”。.ToCharArray(),StringSplitOptions.RemoveEmptyEntries)
.选择(s=>s.Trim()).ToList();
List tlc=c.Split(“|”。.ToCharArray(),StringSplitOptions.RemoveEmptyEntries)
.选择(s=>s.Trim()).ToList();
var t=tla.Intersect(tlb,StringComparer.InvariantCultureInogoreCase);
var tt=tla.Intersect(tlc,StringComparer.InvariantCultureInogoreCase);
你是说

string[] k = a.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
?? 因为源字符串中有空格:

string a = "AID, BID";
顺便说一句,你可以把它写成

var la = a.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var lb = b.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var lc = c.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

var t = la.Intersect(lb, StringComparer.InvariantCultureIgnoreCase).ToList();
var tt = la.Intersect(lc, StringComparer.InvariantCultureIgnoreCase).ToList();
您不需要中间列表,因为LINQ还有
Intersect
方法。

但是缓存结果是值得的,因此您应该调用
ToList
查看最终项目。

谢谢,就这样。我想我应该仔细看看调试器中的列表。应在“9分钟”后标记为答案:)@rjv:当然,很高兴它有帮助。@rjv_rnjn您也可以通过在拆分后修剪子字符串来删除多余的空白。谢谢@phoog。好建议。修改了我的帖子以显示最终代码。@Dan Abramov:看到你的编辑迟到了。我从来没有打算得到那些循环,它只是一步一步地比较代码不起作用和硬编码值起作用的完全相同的代码。再次感谢。
var la = a.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var lb = b.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var lc = c.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

var t = la.Intersect(lb, StringComparer.InvariantCultureIgnoreCase).ToList();
var tt = la.Intersect(lc, StringComparer.InvariantCultureIgnoreCase).ToList();