我正在使用linq查询根据它的id来创建我的集合,这是一个guid。我有一个项目可以与一个或多个产品相关联。我需要的是显示与该项目相关的所有产品名称和其他数据,如名称,摘要,日期以及我在这里的问题是,当我尝试使用变量i,这是我的数组中的guid时,它会抛出Guid无法转换为int的错误。我很确定我是将我的Guid数组转换为int数组但不确定如何实现它。下面是我的代码。
foreach( Guid i in itemid)
{
var vals = from r in datacontext.ItemTable_s where r.itemID == i select r;
ItemTable_s[] tempdata = vals.ToArray<.ItemTable_s>();
Facet[] ftemp= new Facet[tempdata.Length];
ItemImage image = null;
string s1="";
for (int iv = 0; iv < tempdata.Length; iv++)
{
s1 += tempdata[i].productname + "\n";
}
ftemp[3] = new facet("Productname",facettype.text,s1);
collection.AddItem( tempdata[i].ItemName, null, null,
new ItemImage(new Uri(-tempdata[i].location))
);
}
在上面的代码中,tempdata [i]是我收到错误消息的地方,说guid无法隐式转换为int。我如何修复这是否有其他更好的方法?
答案 0 :(得分:2)
改变你的逻辑。而不是使用foreach,使用int for语句。然后从数组中访问itemid。像这样:像这样:
for( int i=0; i<items.Count; i++)
{
...
var vals = from r in datacontext.ItemTable_s where r.itemID == itemid[i] select r;
...
s1 += tempdata[i].productname + "\n";
}
没试过代码,但我希望你能得到这个想法......
答案 1 :(得分:0)
GUID看起来像这样
7c9e6679-7425-40de-944B-e07fc1f90ae7
正如您所看到的那样,没有该角色的Int表示。你的Facet构造函数需要使用GUID而不是int。
答案 2 :(得分:0)
(GUID为128位,因此无法安全地转换为32位整数。)
更好的选择可能是使用Dictionary<Guid, ItemTable_s>
。然后你仍然可以使用GUID对其进行索引。
var tempdata = new Dictionary<Guid, ItemTable_s>;
foreach(var anItem in datacontext.ItemTable_s)
{
tempdata.Add(anItem.ItemID, anItem);
}
然后,当前引发异常(s1 += tempdata[i].productname + "\n";
)的行应该按原样运行。
这也会使您的itemid
阵列变得不必要。或者,您可以保留您正在使用的两个阵列。然后你必须将该行改为:
s1 += tempdata[itemid.IndexOf(i)].productname + "\n";
看起来这就是你打算做的事情。但这比使用字典慢得多。这意味着每次需要确定条目在itemid
中的位置时,您将对tempdata
数组进行顺序搜索。