我错误地使用了Distinct吗?

时间:2013-11-29 17:58:27

标签: c# list

我有一个字符串列表,我想将其解析为唯一值。我认为在逐步完成不同的方法后,它应该有两个值,但它仍然有原始的1001.显然它没有我想要实现的效果。我的问题是,我使用这种方法是错误的,还是我误解了方法的目的。

List<string> theAddressTypes = new List<string>();

Dictionary<string, string> addressTypeDictionary = new Dictionary<string, string>();
foreach (CustomerRow customer in theCustomerData)
{
    theAddressTypes.Add(customer.AddressType);
}

foreach (string value in theAddressTypes.Distinct())
{
    SqlCommand insertAddressType = new SqlCommand("Insert into AddressType Values ('" + value + "'); Select SCOPE_IDENTITY();", 
    newCustConnection);
    string addressTypeId = insertAddressType.ExecuteScalar().ToString();
    addressTypeDictionary.Add(addressTypeId, value);
}

return addressTypeDictionary;

3 个答案:

答案 0 :(得分:1)

是的,Distinct将返回一个不重复的集合。它使用IEquatable来检查两个对象是否相同。

您的代码可以简化为。

List<string> theAddressTypes = (from customer in theCustomerData select customer.AddressType).Distinct().ToList();

您没有在SQL插入语句中定义任何列名。

答案 1 :(得分:0)

Distinct方法返回一个新列表,它不会更改原始列表。这可能是你认为它不起作用的原因。

答案 2 :(得分:0)

我怀疑您正在查看原始来源,而不是IEnumerable创建的DistinctDistinct在您枚举 IEnumerable时工作,因此您的代码很好但不尽可能简洁。

Dictionary<string, string> addressTypeDictionary = new Dictionary<string, string>();

foreach (string value in theCustomerData.Select(c => c.AddressType).Distinct())
{
    string addressTypeId = InsertAddressType(value);
    addressTypeDictionary.Add(addressTypeId, value);
}

return addressTypeDictionary;

...

private string InsertAddressType(string value)
{
    // read up on SQL Injection and do this safely
    using (var newCustConnection = new SqlConnection(...))
    using (var insertAddressType = new SqlCommand("Insert into AddressType Values (@addressTypeValue); Select SCOPE_IDENTITY();", 
    newCustConnection))
    {
        // set parameter value first
        return insertAddressType.ExecuteScalar().ToString();
    }
}

你可能这样做是一个单行,但这样做真的隐藏了你有副作用的事实,而它突出上面(一个foreach读取LINQ代码时通常会突出显示副作用正在发生的事实) :

return (from addressType in theCustomerData.Select(c => c.AddressType).Distinct()
        let id = InsertAddressType(addressType) // side effect here
        select new {id, addressType})
      .ToDictionary(o => o.id, o => o.addressType);

MSDN Enumerable.Distinct