使用.net(C#)比较两个字符串列表并移除不匹配的元素。

10
有没有办法比较两个字符串列表(不区分大小写),或者我需要编写自定义代码来进行这样的比较?我还想从字典中删除不匹配的项。
例如:
List<string> lst1 = new List<string>();
lst1.Add("value1");
lst1.Add("VALUE2");

List<string> lst2 = new List<string>();
lst2.Add("value1");
lst2.Add("value2");
lst2.Add("value3");

现在我想通过比较,仅在lst2中保留"value1"和"value2"。

祝好, JS


请修正您的示例,应该是lst1和lst2。 - Dyppl
3个回答

24
你可以使用LINQ的Intersect方法。
var result = lst1.Intersect(lst2, StringComparer.InvariantCultureIgnoreCase);

您可以使用StringComparer来避免创建自己的IEqualityComparer<string>实现。

如果您希望结果在lst2中,那么可以这样做:

lst2 = lst1.Intersect(lst2, StringComparer.InvariantCultureIgnoreCase).ToList();

2

不用啦,看我的回答,你可以使用StringComparer - Dyppl
谢谢Dyppl!已更新答案。真的很酷。 - rkg

1

您可以使用Intersect扩展方法。要进行不区分大小写的操作,您可以使用等式比较器:

class Program
{
    static void Main(string[] args)
    {

        List<string> lst1 = new List<string>();
        List<string> lst2 = new List<string>();

        CaseInsensitiveEquityComparer comparer = new CaseInsensitiveEquityComparer();

        var result = lst1.Intersect(lst2, comparer);

    }
}

class CaseInsensitiveEquityComparer : IEqualityComparer<string>
{

    public bool Equals(string x, string y)
    {
        return String.Compare(x,y,true,CultureInfo.CurrentCulture) == 0;
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}

1
在C#中通过ToUpper将字符串转换为大写字母进行比较是个不好的想法,最好使用带有相应选项的String.Compare函数。 - Dyppl
@Dyppl,没错 - 不过当时赶时间了。现在已经修好了 ;) - Robert MacLean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接