我有一个字符串列表,我想将其解析为唯一值。我认为在逐步完成不同的方法后,它应该有两个值,但它仍然有原始的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;
答案 0 :(得分:1)
是的,Distinct
将返回一个不重复的集合。它使用IEquatable
来检查两个对象是否相同。
您的代码可以简化为。
List<string> theAddressTypes = (from customer in theCustomerData select customer.AddressType).Distinct().ToList();
您没有在SQL插入语句中定义任何列名。
答案 1 :(得分:0)
Distinct方法返回一个新列表,它不会更改原始列表。这可能是你认为它不起作用的原因。
答案 2 :(得分:0)
我怀疑您正在查看原始来源,而不是IEnumerable
创建的Distinct
。
Distinct
在您枚举 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);