将GUID数组转换为int数组

时间:2012-05-18 17:16:13

标签: c# linq

我正在使用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。我如何修复这是否有其他更好的方法?

3 个答案:

答案 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数组进行顺序搜索。