我有这个功能,我希望在#Data#中获得不同的价值。但我的问题是,如果有两个值相同的字符,但一个是上,一个是低(即喜剧和喜剧),它仍然有我的数据中的喜剧喜剧和喜剧。因此,当我绑定到数据时...它显示两者。
我的功能是:
public void LoadBookGenre(Book abc)
{
var loadbook = from Book s in BookDB.Books where s.Genre == abc.Genre select s;
BookAttribute.Clear();
foreach (Book m in loadbook) BookAttribute.Add(m);
List<Book> distinct = BookAttribute.GroupBy(a => a.Genre).Select(g => g.First()).ToList();
Data.Clear();
foreach (Book s in distinct) Data.Add(s);
}
答案 0 :(得分:5)
您可以使用GroupBy
重载来指定不区分大小写的比较器:
List<Book> distinct =
BookAttribute.GroupBy(a => a.Genre, StringComparer.OrdinalIgnoreCase)
.Select(g => g.First())
.ToList();
根据您的情况,您也可以使用Distinct
:
List<string> distinctGenres =
BookAttribute.Select(a => a.Genre)
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
编辑:您还需要更改初始查询中的相等性检查:
var loadbook = from Book s in BookDB.Books
where s.Genre.Equals(abc.Genre, StringComparison.OrdinalIgnoreCase)
select s;
答案 1 :(得分:1)
常见的解决方案是使用upper()或lower()来维护强制为大写或小写的字符串的版本,并使用该内部字符串进行比较,将原始字符串用作“显示”版本。 / p>
答案 2 :(得分:1)
替换
Data.Add(s);
通过
var found = Data.SingleOrDefault(x => x.Genre.ToUpperInvariant() == s.Genre.ToUpperInvariant());
if (found == null)
{
Data.Add(s);
}
这样,您可以避免两次添加相同的名称,同时保留您找到的第一个名称的大小写。