Linq删除重复忽略大小写
Linq delete duplicate ignore case
我有这样的示例列表数据
var a = {Apple, Orange, WaterMelon, ApplE, Orange, APple}
我想从该列表中删除重复项并获得一个新列表。
我的代码:
var b = a.GroupBy(x => x).Where(y => y.Count() >= 1).Select(z => z.Key).ToList();
但是 return
var b = {Apple, ApplE, APple, Orange, WaterMelon}
如何摆脱这种不同的情况?就像 excel 中的过滤系统一样,只能得到 1 个苹果。
GroupBy
接受一个实现,如果 IEqualityComparer<T>
,StringComparer 实现这个并提供标准的预配置选项:
a.GroupBy(x => x, StringComparer.OrdinalIgnoreCase).Select...
有多个选项可用,包括 CurrentCultureIgnoreCase
、InvariantCultureIgnoreCase
和 OrdinalIgnoreCase
。
更多详情:https://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase(v=vs.110).aspx
这将根据大小写对其进行过滤:
// using System.Linq;
var a = new[]{"Apple", "Orange", "WaterMelon", "ApplE", "Orange", "APple"};
var b = a.Where(x => a.Count(i => i == x) == 1);
如果您想在不考虑大小写的情况下获取它们:
using System.Linq;
using System;
public class Program
{
public static void Main()
{
var a = new[]{"Apple", "Orange", "WaterMelon", "ApplE", "Orange", "APple"};
var b = a.Where(x => a.Count(i => i.Equals(x, StringComparison.OrdinalIgnoreCase )) == 1);
System.Console.WriteLine(string.Join(",", b));
}
}
输出(区分大小写):
Apple,WaterMelon,ApplE,APple
输出(不敏感):
WaterMelon
您可以使用将字符串添加到 lower 作为键并将字符串添加为值的字典。
List<string> mylist = new List<string> { "app", "App", "zz", "zZ" };
Dictionary<string, string> dict = new Dictionary<string, string>();
string key = string.Empty;
foreach(string c in mylist)
{
key = c.ToLower();
if(!dict.Keys.Contains(key))
{
dict.Add(key, c);
}
}
var t = dict.Values;
我有这样的示例列表数据
var a = {Apple, Orange, WaterMelon, ApplE, Orange, APple}
我想从该列表中删除重复项并获得一个新列表。 我的代码:
var b = a.GroupBy(x => x).Where(y => y.Count() >= 1).Select(z => z.Key).ToList();
但是 return
var b = {Apple, ApplE, APple, Orange, WaterMelon}
如何摆脱这种不同的情况?就像 excel 中的过滤系统一样,只能得到 1 个苹果。
GroupBy
接受一个实现,如果 IEqualityComparer<T>
,StringComparer 实现这个并提供标准的预配置选项:
a.GroupBy(x => x, StringComparer.OrdinalIgnoreCase).Select...
有多个选项可用,包括 CurrentCultureIgnoreCase
、InvariantCultureIgnoreCase
和 OrdinalIgnoreCase
。
更多详情:https://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase(v=vs.110).aspx
这将根据大小写对其进行过滤:
// using System.Linq;
var a = new[]{"Apple", "Orange", "WaterMelon", "ApplE", "Orange", "APple"};
var b = a.Where(x => a.Count(i => i == x) == 1);
如果您想在不考虑大小写的情况下获取它们:
using System.Linq;
using System;
public class Program
{
public static void Main()
{
var a = new[]{"Apple", "Orange", "WaterMelon", "ApplE", "Orange", "APple"};
var b = a.Where(x => a.Count(i => i.Equals(x, StringComparison.OrdinalIgnoreCase )) == 1);
System.Console.WriteLine(string.Join(",", b));
}
}
输出(区分大小写):
Apple,WaterMelon,ApplE,APple
输出(不敏感):
WaterMelon
您可以使用将字符串添加到 lower 作为键并将字符串添加为值的字典。
List<string> mylist = new List<string> { "app", "App", "zz", "zZ" };
Dictionary<string, string> dict = new Dictionary<string, string>();
string key = string.Empty;
foreach(string c in mylist)
{
key = c.ToLower();
if(!dict.Keys.Contains(key))
{
dict.Add(key, c);
}
}
var t = dict.Values;