如何获得大小写的明显价值?

时间:2013-12-30 10:18:09

标签: c# linq windows-phone distinct-values

我有这个功能,我希望在#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);
}

3 个答案:

答案 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);
}

这样,您可以避免两次添加相同的名称,同时保留您找到的第一个名称的大小写。